From a37dc952e0828d090967933f08c2ebc6cdb302ab Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 31 May 2014 00:23:21 +0100 Subject: [PATCH] Add other glClearBuffer variants --- renderdoc/driver/gl/gl_common.h | 3 + renderdoc/driver/gl/gl_context_driver.cpp | 148 +++++++++++++++++++++- renderdoc/driver/gl/gl_driver.cpp | 12 ++ renderdoc/driver/gl/gl_driver.h | 3 + renderdoc/driver/gl/gl_hookset.h | 3 + renderdoc/driver/gl/gl_hookset_defs.h | 6 + 6 files changed, 174 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index df1ad621e..9938f03fe 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -121,6 +121,9 @@ enum GLChunkType CLEAR_DEPTH, CLEAR, CLEARBUFFERF, + CLEARBUFFERI, + CLEARBUFFERUI, + CLEARBUFFERFI, CULL_FACE, ENABLE, DISABLE, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index 10fdb214d..f0df4ad65 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -711,12 +711,13 @@ void WrappedOpenGL::glDrawArrays(GLenum mode, GLint first, GLsizei count) m_ContextRecord->AddChunk(scope.Get()); } } + bool WrappedOpenGL::Serialise_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value) { SERIALISE_ELEMENT(GLenum, buf, buffer); SERIALISE_ELEMENT(GLint, draw, drawbuffer); - if(buf != eGL_DEPTH && buf != eGL_STENCIL) + if(buf != eGL_DEPTH) { Vec4f v; if(value) v = *((Vec4f *)value); @@ -767,6 +768,151 @@ void WrappedOpenGL::glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLflo } } +bool WrappedOpenGL::Serialise_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value) +{ + SERIALISE_ELEMENT(GLenum, buf, buffer); + SERIALISE_ELEMENT(GLint, draw, drawbuffer); + + if(buf != eGL_STENCIL) + { + int32_t v[4]; + if(value) memcpy(v, value, sizeof(v)); + + m_pSerialiser->Serialise<4>("value", v); + + if(m_State <= EXECUTING) + m_Real.glClearBufferiv(buf, draw, v); + } + else + { + SERIALISE_ELEMENT(GLint, val, *value); + + if(m_State <= EXECUTING) + m_Real.glClearBufferiv(buf, draw, &val); + } + + const string desc = m_pSerialiser->GetDebugStr(); + + if(m_State == READING) + { + AddEvent(CLEARBUFFERI, desc); + string name = "glClearBufferiv(" + + ToStr::Get(buf) + ", " + + ToStr::Get(draw) + ")"; + + FetchDrawcall draw; + draw.name = widen(name); + draw.flags |= eDraw_Clear; + + AddDrawcall(draw, true); + } + + + return true; +} + +void WrappedOpenGL::glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value) +{ + m_Real.glClearBufferiv(buffer, drawbuffer, value); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERI); + Serialise_glClearBufferiv(buffer, drawbuffer, value); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +bool WrappedOpenGL::Serialise_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value) +{ + SERIALISE_ELEMENT(GLenum, buf, buffer); + SERIALISE_ELEMENT(GLint, draw, drawbuffer); + + { + uint32_t v[4]; + if(value) memcpy(v, value, sizeof(v)); + + m_pSerialiser->Serialise<4>("value", v); + + if(m_State <= EXECUTING) + m_Real.glClearBufferuiv(buf, draw, v); + } + + const string desc = m_pSerialiser->GetDebugStr(); + + if(m_State == READING) + { + AddEvent(CLEARBUFFERUI, desc); + string name = "glClearBufferuiv(" + + ToStr::Get(buf) + ", " + + ToStr::Get(draw) + ")"; + + FetchDrawcall draw; + draw.name = widen(name); + draw.flags |= eDraw_Clear; + + AddDrawcall(draw, true); + } + + return true; +} + +void WrappedOpenGL::glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value) +{ + m_Real.glClearBufferuiv(buffer, drawbuffer, value); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERUI); + Serialise_glClearBufferuiv(buffer, drawbuffer, value); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +bool WrappedOpenGL::Serialise_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) +{ + SERIALISE_ELEMENT(GLenum, buf, buffer); + SERIALISE_ELEMENT(GLint, draw, drawbuffer); + SERIALISE_ELEMENT(GLfloat, d, depth); + SERIALISE_ELEMENT(GLint, s, stencil); + + if(m_State <= EXECUTING) + m_Real.glClearBufferfi(buf, draw, d, s); + + const string desc = m_pSerialiser->GetDebugStr(); + + if(m_State == READING) + { + AddEvent(CLEARBUFFERFI, desc); + string name = "glClearBufferfi(" + + ToStr::Get(buf) + ", " + + ToStr::Get(draw) + ")"; + + FetchDrawcall draw; + draw.name = widen(name); + draw.flags |= eDraw_Clear; + + AddDrawcall(draw, true); + } + + return true; +} + +void WrappedOpenGL::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) +{ + m_Real.glClearBufferfi(buffer, drawbuffer, depth, stencil); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERFI); + Serialise_glClearBufferfi(buffer, drawbuffer, depth, stencil); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glClear(GLbitfield mask) { SERIALISE_ELEMENT(GLbitfield, Mask, mask); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 1c014ae14..93c3d8d82 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -78,6 +78,9 @@ const char *GLChunkNames[] = "glClearDepth", "glClear", "glClearBufferfv", + "glClearBufferiv", + "glClearBufferuiv", + "glClearBufferfi", "glCullFace", "glEnable", "glDisable", @@ -985,6 +988,15 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case CLEARBUFFERF: Serialise_glClearBufferfv(eGL_UNKNOWN_ENUM, 0, NULL); break; + case CLEARBUFFERI: + Serialise_glClearBufferiv(eGL_UNKNOWN_ENUM, 0, NULL); + break; + case CLEARBUFFERUI: + Serialise_glClearBufferuiv(eGL_UNKNOWN_ENUM, 0, NULL); + break; + case CLEARBUFFERFI: + Serialise_glClearBufferfi(eGL_UNKNOWN_ENUM, 0, 0, 0); + break; case DISABLE: Serialise_glDisable(eGL_UNKNOWN_ENUM); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 14607c4c5..6392fb442 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -360,6 +360,9 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glUnmapBuffer(GLenum target)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)); + IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)); + IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)); + IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)); IMPLEMENT_FUNCTION_SERIALISED(void, glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)); IMPLEMENT_FUNCTION_SERIALISED(void, glEnableVertexAttribArray(GLuint index)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index d924f9f17..a01ded320 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -145,6 +145,9 @@ struct GLHookSet PFNGLBINDSAMPLERPROC glBindSampler; PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; PFNGLCLEARBUFFERFVPROC glClearBufferfv; + PFNGLCLEARBUFFERIVPROC glClearBufferiv; + PFNGLCLEARBUFFERUIVPROC glClearBufferuiv; + PFNGLCLEARBUFFERFIPROC glClearBufferfi; PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf; PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv; PFNGLVIEWPORTARRAYVPROC glViewportArrayv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 88ec74eaa..42d8aa9c4 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -157,6 +157,9 @@ HookExtension(PFNGLBINDSAMPLERPROC, glBindSampler); \ HookExtension(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri); \ HookExtension(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); \ + HookExtension(PFNGLCLEARBUFFERIVPROC, glClearBufferiv); \ + HookExtension(PFNGLCLEARBUFFERUIVPROC, glClearBufferuiv); \ + HookExtension(PFNGLCLEARBUFFERFIPROC, glClearBufferfi); \ HookExtension(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf); \ HookExtension(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv); \ HookExtension(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv); \ @@ -349,6 +352,9 @@ HookWrapper2(void, glBindSampler, GLuint, unit, GLuint, sampler); \ HookWrapper3(void, glSamplerParameteri, GLuint, sampler, GLenum, pname, GLint, param); \ HookWrapper3(void, glClearBufferfv, GLenum, buffer, GLint, drawbuffer, const GLfloat *, value); \ + HookWrapper3(void, glClearBufferiv, GLenum, buffer, GLint, drawbuffer, const GLint *, value); \ + HookWrapper3(void, glClearBufferuiv, GLenum, buffer, GLint, drawbuffer, const GLuint *, value); \ + HookWrapper4(void, glClearBufferfi, GLenum, buffer, GLint, drawbuffer, GLfloat, depth, GLint, stencil); \ HookWrapper5(void, glViewportIndexedf, GLuint, index, GLfloat, x, GLfloat, y, GLfloat, w, GLfloat, h); \ HookWrapper2(void, glViewportIndexedfv, GLuint, index, const GLfloat *, v); \ HookWrapper3(void, glViewportArrayv, GLuint, first, GLsizei, count, const GLfloat *, v); \