diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index fd8f268ae..0fcb9a4bd 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -137,6 +137,7 @@ enum GLChunkType GEN_QUERIES, BEGIN_QUERY, END_QUERY, + QUERY_COUNTER, CLEAR_COLOR, CLEAR_DEPTH, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index a6cb35527..56f1383a3 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -90,6 +90,7 @@ const char *GLChunkNames[] = "glGenQueries", "glBeginQuery", "glEndQuery", + "glQueryCounter", "glClearColor", "glClearDepth", @@ -1545,6 +1546,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case END_QUERY: Serialise_glEndQuery(eGL_NONE); break; + case QUERY_COUNTER: + Serialise_glQueryCounter(0, eGL_NONE); + break; case CLEAR_COLOR: Serialise_glClearColor(0, 0, 0, 0); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index ae93bb0ad..b4557cddb 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -433,6 +433,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glGenQueries(GLsizei n, GLuint *ids)); IMPLEMENT_FUNCTION_SERIALISED(void, glBeginQuery(GLenum target, GLuint id)); IMPLEMENT_FUNCTION_SERIALISED(void, glEndQuery(GLenum target)); + IMPLEMENT_FUNCTION_SERIALISED(void, glQueryCounter(GLuint id, GLenum target)); IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteQueries(GLsizei n, const GLuint *ids)); IMPLEMENT_FUNCTION_SERIALISED(void, glActiveTexture(GLenum texture)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 0a0e0ab9d..4ef971494 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -288,6 +288,7 @@ struct GLHookSet PFNGLGENQUERIESPROC glGenQueries; PFNGLBEGINQUERYPROC glBeginQuery; PFNGLENDQUERYPROC glEndQuery; + PFNGLQUERYCOUNTERPROC glQueryCounter; PFNGLDELETEQUERIESPROC glDeleteQueries; PFNGLBUFFERDATAPROC glBufferData; PFNGLBUFFERSTORAGEPROC glBufferStorage; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 4525020fa..fc2e1a2ad 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -307,6 +307,7 @@ HookExtension(PFNGLGENQUERIESPROC, glGenQueries); \ HookExtension(PFNGLBEGINQUERYPROC, glBeginQuery); \ HookExtension(PFNGLENDQUERYPROC, glEndQuery); \ + HookExtension(PFNGLQUERYCOUNTERPROC, glQueryCounter); \ HookExtension(PFNGLDELETEQUERIESPROC, glDeleteQueries); \ HookExtension(PFNGLBUFFERDATAPROC, glBufferData); \ HookExtension(PFNGLBUFFERSTORAGEPROC, glBufferStorage); \ @@ -903,6 +904,7 @@ HookWrapper2(void, glGenQueries, GLsizei, n, GLuint *, ids); \ HookWrapper2(void, glBeginQuery, GLenum, target, GLuint, id); \ HookWrapper1(void, glEndQuery, GLenum, target); \ + HookWrapper2(void, glQueryCounter, GLuint, id, GLenum, target); \ HookWrapper2(void, glDeleteQueries, GLsizei, n, const GLuint *, ids); \ HookWrapper4(void, glBufferData, GLenum, target, GLsizeiptr, size, const void *, data, GLenum, usage); \ HookWrapper4(void, glBufferStorage, GLenum, target, GLsizeiptr, size, const void *, data, GLbitfield, flags); \ diff --git a/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp index 4ce3bc663..0202dadea 100644 --- a/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp @@ -253,6 +253,32 @@ void WrappedOpenGL::glEndQuery(GLenum target) } } +bool WrappedOpenGL::Serialise_glQueryCounter(GLuint query, GLenum target) +{ + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(QueryRes(GetCtx(), query))); + SERIALISE_ELEMENT(GLenum, Target, target); + + if(m_State < WRITING) + { + glQueryCounter(GetResourceManager()->GetLiveResource(id).name, Target); + } + + return true; +} + +void WrappedOpenGL::glQueryCounter(GLuint query, GLenum target) +{ + m_Real.glQueryCounter(query, target); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(QUERY_COUNTER); + Serialise_glQueryCounter(query, target); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glDeleteQueries(GLsizei n, const GLuint *ids) { m_Real.glDeleteQueries(n, ids);