diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 66e122b7b..faca07bb8 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -158,9 +158,9 @@ const char *GLChunkNames[] = "glDeleteBuffer", "glObjectLabel", - "PushMarker", - "SetMarker", - "PopMarker", + "glPushDebugGroup", + "glDebugMessageInsert", + "glPopDebugGroup", "Capture", "BeginCapture", @@ -811,11 +811,94 @@ void WrappedOpenGL::glDebugMessageControl(GLenum source, GLenum type, GLenum sev m_Real.glDebugMessageControl(source, type, severity, count, ids, enabled); } +bool WrappedOpenGL::Serialise_glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) +{ + wstring name = name_ ? widen(string(buf, buf+length)) : L""; + + m_pSerialiser->Serialise("Name", name); + + if(m_State == READING) + { + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_SetMarker; + + AddDrawcall(draw, false); + } + + return true; +} + void WrappedOpenGL::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) { + if(m_State == WRITING_CAPFRAME && type == eGL_DEBUG_TYPE_MARKER) + { + SCOPED_SERIALISE_CONTEXT(SET_MARKER); + Serialise_glDebugMessageInsert(source, type, id, severity, length, buf); + + m_ContextRecord->AddChunk(scope.Get()); + } + m_Real.glDebugMessageInsert(source, type, id, severity, length, buf); } +bool WrappedOpenGL::Serialise_glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message) +{ + wstring name = message ? widen(string(message, message+length)) : L""; + + m_pSerialiser->Serialise("Name", name); + + if(m_State == READING) + { + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_PushMarker; + + AddDrawcall(draw, false); + } + + return true; +} + +void WrappedOpenGL::glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message) +{ + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(BEGIN_EVENT); + Serialise_glPushDebugGroup(source, id, length, message); + + m_ContextRecord->AddChunk(scope.Get()); + } + + m_Real.glPushDebugGroup(source, id, length, message); +} + +bool WrappedOpenGL::Serialise_glPopDebugGroup() +{ + if(m_State == READING && !m_CurEvents.empty()) + { + FetchDrawcall draw; + draw.name = L"API Calls"; + draw.flags |= eDraw_SetMarker; + + AddDrawcall(draw, true); + } + + return true; +} +void WrappedOpenGL::glPopDebugGroup() +{ + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(END_EVENT); + Serialise_glPopDebugGroup(); + + m_ContextRecord->AddChunk(scope.Get()); + } + + m_Real.glPopDebugGroup(); +} + void WrappedOpenGL::ReadLogInitialisation() { uint64_t lastFrame = 0; @@ -1258,6 +1341,15 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case OBJECT_LABEL: Serialise_glObjectLabel(eGL_UNKNOWN_ENUM, 0, 0, NULL); break; + case BEGIN_EVENT: + Serialise_glPushDebugGroup(eGL_UNKNOWN_ENUM, 0, 0, NULL); + break; + case SET_MARKER: + Serialise_glDebugMessageInsert(eGL_UNKNOWN_ENUM, eGL_UNKNOWN_ENUM, 0, eGL_UNKNOWN_ENUM, 0, NULL); + break; + case END_EVENT: + Serialise_glPopDebugGroup(); + break; case CAPTURE_SCOPE: Serialise_CaptureScope(offset); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index e0d9f7a68..4663a06a4 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -350,6 +350,8 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam)); IMPLEMENT_FUNCTION_SERIALISED(void, glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)); IMPLEMENT_FUNCTION_SERIALISED(void, glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)); + IMPLEMENT_FUNCTION_SERIALISED(void, glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)); + IMPLEMENT_FUNCTION_SERIALISED(void, glPopDebugGroup()); IMPLEMENT_FUNCTION_SERIALISED(void, glActiveTexture(GLenum texture)); IMPLEMENT_FUNCTION_SERIALISED(void, glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)); IMPLEMENT_FUNCTION_SERIALISED(void, glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 748f4a0e4..b3ce0f93c 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -143,6 +143,8 @@ struct GLHookSet PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; // aliases glDebugMessageCallbackARB PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert; + PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup; + PFNGLPOPDEBUGGROUPPROC glPopDebugGroup; PFNGLGETOBJECTLABELPROC glGetObjectLabel; PFNGLOBJECTLABELPROC glObjectLabel; PFNGLENABLEIPROC glEnablei; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 76b7d9574..52e35edcd 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -155,6 +155,8 @@ HookExtensionAlias(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback, glDebugMessageCallbackARB); \ HookExtension(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl); \ HookExtension(PFNGLDEBUGMESSAGEINSERTPROC, glDebugMessageInsert); \ + HookExtension(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup); \ + HookExtension(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup); \ HookExtension(PFNGLGETOBJECTLABELPROC, glGetObjectLabel); \ HookExtension(PFNGLOBJECTLABELPROC, glObjectLabel); \ HookExtension(PFNGLENABLEIPROC, glEnablei); \ @@ -416,6 +418,8 @@ HookWrapper2(void, glDebugMessageCallback, GLDEBUGPROC, callback, const void *, userParam); \ HookWrapper6(void, glDebugMessageControl, GLenum, source, GLenum, type, GLenum, severity, GLsizei, count, const GLuint *, ids, GLboolean, enabled); \ HookWrapper6(void, glDebugMessageInsert, GLenum, source, GLenum, type, GLuint, id, GLenum, severity, GLsizei, length, const GLchar *, buf); \ + HookWrapper4(void, glPushDebugGroup, GLenum, source, GLuint, id, GLsizei, length, const GLchar *, message); \ + HookWrapper0(void, glPopDebugGroup); \ HookWrapper5(void, glGetObjectLabel, GLenum, identifier, GLuint, name, GLsizei, bufSize, GLsizei *, length, GLchar *, label); \ HookWrapper4(void, glObjectLabel, GLenum, identifier, GLuint, name, GLsizei, length, const GLchar *, label); \ HookWrapper2(void, glEnablei, GLenum, target, GLuint, index); \