diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 52d622646..444b2f62d 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -241,6 +241,7 @@ enum GLChunkType DRAWELEMENTS, DRAWELEMENTS_INDIRECT, DRAWRANGEELEMENTS, + DRAWRANGEELEMENTSBASEVERTEX, DRAWELEMENTS_INSTANCED, DRAWELEMENTS_INSTANCEDBASEINSTANCE, DRAWELEMENTS_BASEVERTEX, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 9461cf5cc..8846b468a 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -186,6 +186,7 @@ const char *GLChunkNames[] = "glDrawElements", "glDrawElementsIndirect", "glDrawRangeElements", + "glDrawRangeElementsBaseVertex", "glDrawElementsInstanced", "glDrawElementsInstancedBaseInstance", "glDrawElementsBaseVertex", @@ -1980,6 +1981,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DRAWRANGEELEMENTS: Serialise_glDrawRangeElements(eGL_NONE, 0, 0, 0, eGL_NONE, NULL); break; + case DRAWRANGEELEMENTSBASEVERTEX: + Serialise_glDrawRangeElementsBaseVertex(eGL_NONE, 0, 0, 0, eGL_NONE, NULL, 0); + break; case DRAWELEMENTS_INSTANCED: Serialise_glDrawElementsInstanced(eGL_NONE, 0, eGL_NONE, NULL, 0); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 9bec125b2..ea61658e5 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -965,6 +965,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance)); IMPLEMENT_FUNCTION_SERIALISED(void, glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)); IMPLEMENT_FUNCTION_SERIALISED(void, glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)); IMPLEMENT_FUNCTION_SERIALISED(void, glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)); IMPLEMENT_FUNCTION_SERIALISED(void, glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount)); IMPLEMENT_FUNCTION_SERIALISED(void, glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index cf2f6fee8..66cfb122d 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -569,6 +569,7 @@ struct GLHookSet PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glProgramUniformMatrix4x2dv; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glProgramUniformMatrix4x3dv; PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; + PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glDrawRangeElementsBaseVertex; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstance; PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index d26f23e19..3efae6237 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -599,6 +599,7 @@ HookExtension(PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC, glProgramUniformMatrix4x2dv); \ HookExtension(PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC, glProgramUniformMatrix4x3dv); \ HookExtension(PFNGLDRAWRANGEELEMENTSPROC, glDrawRangeElements); \ + HookExtension(PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC, glDrawRangeElementsBaseVertex); \ HookExtension(PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC, glDrawArraysInstancedBaseInstance); \ HookExtension(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced); \ HookExtension(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced); \ @@ -1262,6 +1263,7 @@ HookWrapper5(void, glProgramUniformMatrix4x2dv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLdouble *, value); \ HookWrapper5(void, glProgramUniformMatrix4x3dv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLdouble *, value); \ HookWrapper6(void, glDrawRangeElements, GLenum, mode, GLuint, start, GLuint, end, GLsizei, count, GLenum, type, const void *, indices); \ + HookWrapper7(void, glDrawRangeElementsBaseVertex, GLenum, mode, GLuint, start, GLuint, end, GLsizei, count, GLenum, type, const void *, indices, GLint, basevertex); \ HookWrapper5(void, glDrawArraysInstancedBaseInstance, GLenum, mode, GLint, first, GLsizei, count, GLsizei, instancecount, GLuint, baseinstance); \ HookWrapper4(void, glDrawArraysInstanced, GLenum, mode, GLint, first, GLsizei, count, GLsizei, instancecount); \ HookWrapper5(void, glDrawElementsInstanced, GLenum, mode, GLsizei, count, GLenum, type, const void *, indices, GLsizei, instancecount); \ diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index b251d4835..5a7e1facf 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -557,6 +557,70 @@ void WrappedOpenGL::glDrawRangeElements(GLenum mode, GLuint start, GLuint end, G } } +bool WrappedOpenGL::Serialise_glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex) +{ + SERIALISE_ELEMENT(GLenum, Mode, mode); + SERIALISE_ELEMENT(uint32_t, Start, start); + SERIALISE_ELEMENT(uint32_t, End, end); + SERIALISE_ELEMENT(uint32_t, Count, count); + SERIALISE_ELEMENT(GLenum, Type, type); + SERIALISE_ELEMENT(uint64_t, IdxOffset, (uint64_t)indices); + SERIALISE_ELEMENT(uint32_t, BaseVtx, basevertex); + + if(m_State <= EXECUTING) + { + m_Real.glDrawRangeElementsBaseVertex(Mode, Start, End, Count, Type, (const void *)IdxOffset, BaseVtx); + } + + const string desc = m_pSerialiser->GetDebugStr(); + + vector debugMessages = Serialise_DebugMessages(); + + if(m_State == READING) + { + AddEvent(DRAWELEMENTS, desc); + string name = "glDrawRangeElementsBaseVertex(" + + ToStr::Get(Mode) + ", " + + ToStr::Get(Count) + ", " + + ToStr::Get(Type) + ", " + + ToStr::Get(IdxOffset) + ", " + + ToStr::Get(BaseVtx) + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.numIndices = Count; + draw.numInstances = 1; + draw.indexOffset = (uint32_t)IdxOffset; + draw.vertexOffset = BaseVtx; + draw.instanceOffset = 0; + + draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; + + draw.debugMessages = debugMessages; + + m_LastDrawMode = Mode; + m_LastIndexSize = Type; + m_LastIndexOffset = (GLuint)IdxOffset; + + AddDrawcall(draw, true); + } + + return true; +} + +void WrappedOpenGL::glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex) +{ + m_Real.glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DRAWRANGEELEMENTSBASEVERTEX); + Serialise_glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) { SERIALISE_ELEMENT(GLenum, Mode, mode);