From c02a8d7786e83abc81da8c8bbaedd77f943bc963 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 20 Dec 2014 09:29:43 +0000 Subject: [PATCH] Implement GREMEDY string marker and frame terminator extensions * We don't try and detect duplicate markers between GREMEDY and KHR_debug, just assume the program is smart enough to detect that both are available and pick only one to use. --- renderdoc/driver/gl/gl_driver.cpp | 2 ++ renderdoc/driver/gl/gl_driver.h | 3 +++ renderdoc/driver/gl/gl_hookset.h | 2 ++ renderdoc/driver/gl/gl_hookset_defs.h | 8 ++++---- renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp | 16 ++++++++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 7b5b9a177..ac035e6a8 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -460,6 +460,8 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_EXT_texture_mirror_clamp"); globalExts.push_back("GL_EXT_texture_sRGB_decode"); globalExts.push_back("GL_EXT_timer_query"); + globalExts.push_back("GL_GREMEDY_string_marker"); + globalExts.push_back("GL_GREMEDY_frame_terminator"); globalExts.push_back("GL_KHR_debug"); // we'll be sorting the implementation extension array, so make sure the diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 5d324486c..4c12d6af1 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -493,6 +493,9 @@ class WrappedOpenGL 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, glFrameTerminatorGREMEDY()); + IMPLEMENT_FUNCTION_SERIALISED(void, glStringMarkerGREMEDY(GLsizei len, const void *string)); bool Serialise_glFenceSync(GLsync real, GLenum condition, GLbitfield flags); GLsync glFenceSync(GLenum condition, GLbitfield flags); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index b19b35e97..0e884163d 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -734,5 +734,7 @@ struct GLHookSet PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glVertexArrayVertexBindingDivisorEXT; PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glVertexArrayVertexAttribLOffsetEXT; PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glVertexArrayVertexAttribDivisorEXT; + PFNGLFRAMETERMINATORGREMEDYPROC glFrameTerminatorGREMEDY; + PFNGLSTRINGMARKERGREMEDYPROC glStringMarkerGREMEDY; // -- }; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index d42b3affc..b881c1dbf 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -862,6 +862,8 @@ HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC, glVertexArrayVertexAttribLOffsetEXT); \ HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC, glVertexArrayVertexAttribDivisorEXT); \ HookExtension(PFNGLPOLYGONOFFSETCLAMPEXTPROC, glPolygonOffsetClampEXT); \ + HookExtension(PFNGLFRAMETERMINATORGREMEDYPROC, glFrameTerminatorGREMEDY); \ + HookExtension(PFNGLSTRINGMARKERGREMEDYPROC, glStringMarkerGREMEDY); \ HookExtension(PFNGLCULLFACEPROC, glCullFace); \ HookExtension(PFNGLFRONTFACEPROC, glFrontFace); \ HookExtension(PFNGLHINTPROC, glHint); \ @@ -1634,6 +1636,8 @@ HookWrapper7(void, glVertexArrayVertexAttribLOffsetEXT, GLuint, vaobj, GLuint, buffer, GLuint, index, GLint, size, GLenum, type, GLsizei, stride, GLintptr, offset); \ HookWrapper3(void, glVertexArrayVertexAttribDivisorEXT, GLuint, vaobj, GLuint, index, GLuint, divisor); \ HookWrapper3(void, glPolygonOffsetClampEXT, GLfloat, factor, GLfloat, units, GLfloat, clamp); \ + HookWrapper0(void, glFrameTerminatorGREMEDY); \ + HookWrapper2(void, glStringMarkerGREMEDY, GLsizei, len, const void *, string); \ @@ -2722,8 +2726,6 @@ HookWrapper1(void, glvertexweightfvext, const GLfloat *, weight); \ HookWrapper4(void, glvertexweightpointerext, GLint, size, GLenum, type, GLsizei, stride, const void *, pointer); \ HookWrapper3(GLsync, glimportsyncext, GLenum, external_sync_type, GLintptr, external_sync, GLbitfield, flags); \ - HookWrapper0(void, glframeterminatorgremedy); \ - HookWrapper2(void, glstringmarkergremedy, GLsizei, len, const void *, string); \ HookWrapper3(void, glimagetransformparameterihp, GLenum, target, GLenum, pname, GLint, param); \ HookWrapper3(void, glimagetransformparameterfhp, GLenum, target, GLenum, pname, GLfloat, param); \ HookWrapper3(void, glimagetransformparameterivhp, GLenum, target, GLenum, pname, const GLint *, params); \ @@ -4419,8 +4421,6 @@ HandleUnsupported(PFNGLVERTEXWEIGHTFVEXTPROC, glvertexweightfvext); \ HandleUnsupported(PFNGLVERTEXWEIGHTPOINTEREXTPROC, glvertexweightpointerext); \ HandleUnsupported(PFNGLIMPORTSYNCEXTPROC, glimportsyncext); \ - HandleUnsupported(PFNGLFRAMETERMINATORGREMEDYPROC, glframeterminatorgremedy); \ - HandleUnsupported(PFNGLSTRINGMARKERGREMEDYPROC, glstringmarkergremedy); \ HandleUnsupported(PFNGLIMAGETRANSFORMPARAMETERIHPPROC, glimagetransformparameterihp); \ HandleUnsupported(PFNGLIMAGETRANSFORMPARAMETERFHPPROC, glimagetransformparameterfhp); \ HandleUnsupported(PFNGLIMAGETRANSFORMPARAMETERIVHPPROC, glimagetransformparameterivhp); \ diff --git a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp index 497f0e911..8f06077f0 100644 --- a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp @@ -167,6 +167,22 @@ void WrappedOpenGL::glDebugMessageInsert(GLenum source, GLenum type, GLuint id, m_Real.glDebugMessageInsert(source, type, id, severity, length, buf); } +void WrappedOpenGL::glFrameTerminatorGREMEDY() +{ + Present(NULL); +} + +void WrappedOpenGL::glStringMarkerGREMEDY(GLsizei len, const void *string) +{ + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(SET_MARKER); + Serialise_glDebugMessageInsert(eGL_NONE, eGL_NONE, 0, eGL_NONE, len, (const GLchar *)string); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message) { string name = message ? string(message, message + (length > 0 ? length : strlen(message))) : "";