From 9c16d1e75c1530d67922f3f345b33fda0528c6b9 Mon Sep 17 00:00:00 2001 From: Logan McNaughton Date: Tue, 7 Feb 2017 11:44:52 -0800 Subject: [PATCH] Make compatible with apitrace in Debug mode --- src/CMakeLists.txt | 6 +++--- src/Graphics/OpenGLContext/GLFunctions.cpp | 2 ++ src/Graphics/OpenGLContext/GLFunctions.h | 2 ++ .../opengl_BufferManipulationObjectFactory.cpp | 14 ++++++++++++-- .../OpenGLContext/opengl_BufferedDrawer.cpp | 15 +++++++++++++-- .../OpenGLContext/opengl_BufferedDrawer.h | 2 ++ 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5795786b..12515e5d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -241,9 +241,9 @@ endif( NOT CMAKE_BUILD_TYPE) if( CMAKE_BUILD_TYPE STREQUAL "Debug") set( CMAKE_BUILD_TYPE Debug) set( DEBUG_BUILD TRUE) -# add_definitions( -# -DDEBUG -# ) + add_definitions( + -DGL_DEBUG + ) endif( CMAKE_BUILD_TYPE STREQUAL "Debug") if(EGL) diff --git a/src/Graphics/OpenGLContext/GLFunctions.cpp b/src/Graphics/OpenGLContext/GLFunctions.cpp index 61ecee29..e010f0ba 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.cpp +++ b/src/Graphics/OpenGLContext/GLFunctions.cpp @@ -163,6 +163,7 @@ PFNGLCREATEBUFFERSPROC g_glCreateBuffers; PFNGLCREATEFRAMEBUFFERSPROC g_glCreateFramebuffers; PFNGLNAMEDFRAMEBUFFERTEXTUREPROC g_glNamedFramebufferTexture; PFNGLDRAWELEMENTSBASEVERTEXPROC g_glDrawElementsBaseVertex; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC g_glFlushMappedBufferRange; void initGLFunctions() { @@ -297,4 +298,5 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLCREATEFRAMEBUFFERSPROC, glCreateFramebuffers); GL_GET_PROC_ADR(PFNGLNAMEDFRAMEBUFFERTEXTUREPROC, glNamedFramebufferTexture); GL_GET_PROC_ADR(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex); + GL_GET_PROC_ADR(PFNGLFLUSHMAPPEDBUFFERRANGEPROC, glFlushMappedBufferRange); } diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h index 9ae338be..dce055cf 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.h +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -180,6 +180,7 @@ extern PFNGLBLENDCOLORPROC g_glBlendColor; #define glCreateFramebuffers g_glCreateFramebuffers #define glNamedFramebufferTexture g_glNamedFramebufferTexture #define glDrawElementsBaseVertex g_glDrawElementsBaseVertex +#define glFlushMappedBufferRange g_glFlushMappedBufferRange extern PFNGLCREATESHADERPROC g_glCreateShader; extern PFNGLCOMPILESHADERPROC g_glCompileShader; @@ -273,6 +274,7 @@ extern PFNGLCREATEBUFFERSPROC g_glCreateBuffers; extern PFNGLCREATEFRAMEBUFFERSPROC g_glCreateFramebuffers; extern PFNGLNAMEDFRAMEBUFFERTEXTUREPROC g_glNamedFramebufferTexture; extern PFNGLDRAWELEMENTSBASEVERTEXPROC g_glDrawElementsBaseVertex; +extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC g_glFlushMappedBufferRange; void initGLFunctions(); diff --git a/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp b/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp index df0b7411..ecdb3537 100644 --- a/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp +++ b/src/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp @@ -179,8 +179,8 @@ public: { glGenBuffers(1, &m_PBO); m_bind->bind(graphics::Parameter(GL_PIXEL_UNPACK_BUFFER), graphics::ObjectHandle(m_PBO)); - glBufferStorage(GL_PIXEL_UNPACK_BUFFER, m_size * 32, nullptr, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - m_bufferData = glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, m_size * 32, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + glBufferStorage(GL_PIXEL_UNPACK_BUFFER, m_size * 32, nullptr, m_bufAccessBits); + m_bufferData = glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, m_size * 32, m_bufMapBits); m_bufferOffset = 0; m_bind->bind(graphics::Parameter(GL_PIXEL_UNPACK_BUFFER), graphics::ObjectHandle()); } @@ -201,6 +201,9 @@ public: void closeWriteBuffer() override { +#ifdef GL_DEBUG + glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, m_bufferOffset, m_size); +#endif m_bufferOffset += m_size; } @@ -222,6 +225,13 @@ private: void* m_bufferData; u32 m_bufferOffset; GLuint m_PBO; +#ifndef GL_DEBUG + GLbitfield m_bufAccessBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; + GLbitfield m_bufMapBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; +#else + GLbitfield m_bufAccessBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT; + GLbitfield m_bufMapBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; +#endif }; class MemoryWriteBuffer : public graphics::PixelWriteBuffer diff --git a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp index 0903826b..5744ee6e 100644 --- a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp +++ b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp @@ -8,6 +8,13 @@ using namespace graphics; using namespace opengl; const u32 BufferedDrawer::m_bufMaxSize = 4194304; +#ifndef GL_DEBUG +const GLbitfield BufferedDrawer::m_bufAccessBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; +const GLbitfield BufferedDrawer::m_bufMapBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; +#else +const GLbitfield BufferedDrawer::m_bufAccessBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT; +const GLbitfield BufferedDrawer::m_bufMapBits = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; +#endif BufferedDrawer::BufferedDrawer(const GLInfo & _glinfo, CachedVertexAttribArray * _cachedAttribArray, CachedBindBuffer * _bindBuffer) : m_glInfo(_glinfo) @@ -48,8 +55,8 @@ void BufferedDrawer::_initBuffer(Buffer & _buffer, GLuint _bufSize) glGenBuffers(1, &_buffer.handle); m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle)); if (m_glInfo.bufferStorage) { - glBufferStorage(_buffer.type, _bufSize, nullptr, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - _buffer.data = (GLubyte*)glMapBufferRange(_buffer.type, 0, _bufSize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + glBufferStorage(_buffer.type, _bufSize, nullptr, m_bufAccessBits); + _buffer.data = (GLubyte*)glMapBufferRange(_buffer.type, 0, _bufSize, m_bufMapBits); } else { glBufferData(_buffer.type, _bufSize, nullptr, GL_DYNAMIC_DRAW); } @@ -75,6 +82,10 @@ void BufferedDrawer::_updateBuffer(Buffer & _buffer, u32 _count, u32 _dataSize, if (m_glInfo.bufferStorage) { memcpy(&_buffer.data[_buffer.offset], _data, _dataSize); +#ifdef GL_DEBUG + m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle)); + glFlushMappedBufferRange(_buffer.type, _buffer.offset, _dataSize); +#endif } else { m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle)); void* buffer_pointer = glMapBufferRange(_buffer.type, _buffer.offset, _dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); diff --git a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h index 75e6b36a..ec47052d 100644 --- a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h +++ b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h @@ -77,6 +77,8 @@ namespace opengl { BufferOffsets m_rectBufferOffsets; static const u32 m_bufMaxSize; + static const GLbitfield m_bufAccessBits; + static const GLbitfield m_bufMapBits; }; }