Support Push/Pop markers from KHR_debug and implement begin/set/end

This commit is contained in:
Baldur Karlsson
2014-06-17 17:23:41 +01:00
parent b659c734a1
commit e78f728799
4 changed files with 103 additions and 3 deletions
+95 -3
View File
@@ -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);
+2
View File
@@ -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));
+2
View File
@@ -143,6 +143,8 @@ struct GLHookSet
PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; // aliases glDebugMessageCallbackARB
PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl;
PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert;
PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup;
PFNGLPOPDEBUGGROUPPROC glPopDebugGroup;
PFNGLGETOBJECTLABELPROC glGetObjectLabel;
PFNGLOBJECTLABELPROC glObjectLabel;
PFNGLENABLEIPROC glEnablei;
+4
View File
@@ -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); \