From 5b3a8aabdb65d0e29fc90ec46b3eb88bf9845d9e Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 8 Nov 2014 13:01:01 +0000 Subject: [PATCH] Implement glClearBufferSubData --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_driver.cpp | 4 + renderdoc/driver/gl/gl_driver.h | 3 +- renderdoc/driver/gl/gl_hookset.h | 1 + renderdoc/driver/gl/gl_hookset_defs.h | 2 + .../driver/gl/wrappers/gl_draw_funcs.cpp | 87 +++++++++++++++++++ 6 files changed, 97 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index f559a36cf..680877111 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -152,6 +152,7 @@ enum GLChunkType CLEARBUFFERUI, CLEARBUFFERFI, CLEARBUFFERDATA, + CLEARBUFFERSUBDATA, POLYGON_MODE, POLYGON_OFFSET, CULL_FACE, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index f430adca1..da70c80d0 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -105,6 +105,7 @@ const char *GLChunkNames[] = "glClearBufferuiv", "glClearBufferfi", "glClearBufferData", + "glClearBufferSubData", "glPolygonMode", "glPolygonOffset", "glCullFace", @@ -1594,6 +1595,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case CLEARBUFFERDATA: Serialise_glClearBufferData(eGL_NONE, eGL_NONE, eGL_NONE, eGL_NONE, NULL); break; + case CLEARBUFFERSUBDATA: + Serialise_glClearBufferSubData(eGL_NONE, eGL_NONE, 0, 0, eGL_NONE, eGL_NONE, NULL); + break; case POLYGON_MODE: Serialise_glPolygonMode(eGL_NONE, eGL_NONE); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index a44840398..c727783f0 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -503,7 +503,8 @@ class WrappedOpenGL 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, glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data)); - + IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)); + enum AttribType { Attrib_GLdouble = 0x01, diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 97b4e63ee..b6f96e102 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -416,6 +416,7 @@ struct GLHookSet PFNGLCLEARBUFFERUIVPROC glClearBufferuiv; PFNGLCLEARBUFFERFIPROC glClearBufferfi; PFNGLCLEARBUFFERDATAPROC glClearBufferData; + PFNGLCLEARBUFFERSUBDATAPROC glClearBufferSubData; PFNGLSCISSORARRAYVPROC glScissorArrayv; PFNGLSCISSORINDEXEDPROC glScissorIndexed; PFNGLSCISSORINDEXEDVPROC glScissorIndexedv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index cd9cb8278..9e5023b63 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -435,6 +435,7 @@ HookExtension(PFNGLCLEARBUFFERUIVPROC, glClearBufferuiv); \ HookExtension(PFNGLCLEARBUFFERFIPROC, glClearBufferfi); \ HookExtension(PFNGLCLEARBUFFERDATAPROC, glClearBufferData); \ + HookExtension(PFNGLCLEARBUFFERSUBDATAPROC, glClearBufferSubData); \ HookExtension(PFNGLSCISSORARRAYVPROC, glScissorArrayv); \ HookExtension(PFNGLSCISSORINDEXEDPROC, glScissorIndexed); \ HookExtension(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv); \ @@ -1037,6 +1038,7 @@ HookWrapper3(void, glClearBufferuiv, GLenum, buffer, GLint, drawbuffer, const GLuint *, value); \ HookWrapper4(void, glClearBufferfi, GLenum, buffer, GLint, drawbuffer, GLfloat, depth, GLint, stencil); \ HookWrapper5(void, glClearBufferData, GLenum, target, GLenum, internalformat, GLenum, format, GLenum, type, const void *, data); \ + HookWrapper7(void, glClearBufferSubData, GLenum, target, GLenum, internalformat, GLintptr, offset, GLsizeiptr, size, GLenum, format, GLenum, type, const void *, data); \ HookWrapper3(void, glScissorArrayv, GLuint, first, GLsizei, count, const GLint *, v); \ HookWrapper5(void, glScissorIndexed, GLuint, index, GLint, left, GLint, bottom, GLsizei, width, GLsizei, height); \ HookWrapper2(void, glScissorIndexedv, GLuint, index, const GLint *, v); \ diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 8c3244bfc..31ba7c40e 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -1015,6 +1015,93 @@ void WrappedOpenGL::glClearBufferData(GLenum target, GLenum internalformat, GLen } } +bool WrappedOpenGL::Serialise_glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) +{ + SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(GLenum, InternalFormat, internalformat); + SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset); + SERIALISE_ELEMENT(uint64_t, Size, (uint64_t)size); + SERIALISE_ELEMENT(GLenum, Format, format); + SERIALISE_ELEMENT(GLenum, Type, type); + + uint64_t val[4] = {0}; + + if(m_State >= WRITING) + { + size_t s = 1; + switch(Format) + { + default: + RDCWARN("Unexpected format %x, defaulting to single component", Format); + case eGL_RED: + case eGL_DEPTH_COMPONENT: + s = 1; break; + case eGL_RG: + case eGL_DEPTH_STENCIL: + s = 2; break; + case eGL_RGB: + case eGL_BGR: + s = 3; break; + case eGL_RGBA: + case eGL_BGRA: + s = 4; break; + } + switch(Type) + { + case eGL_UNSIGNED_BYTE: + case eGL_BYTE: + s *= 1; break; + case eGL_UNSIGNED_SHORT: + case eGL_SHORT: + s *= 2; break; + case eGL_UNSIGNED_INT: + case eGL_INT: + case eGL_FLOAT: + s *= 4; break; + default: + RDCWARN("Unexpected type %x, defaulting to 1 byte single component type", Format); + case eGL_UNSIGNED_BYTE_3_3_2: + case eGL_UNSIGNED_BYTE_2_3_3_REV: + s = 1; break; + case eGL_UNSIGNED_SHORT_5_6_5: + case eGL_UNSIGNED_SHORT_5_6_5_REV: + case eGL_UNSIGNED_SHORT_4_4_4_4: + case eGL_UNSIGNED_SHORT_4_4_4_4_REV: + case eGL_UNSIGNED_SHORT_5_5_5_1: + case eGL_UNSIGNED_SHORT_1_5_5_5_REV: + case eGL_UNSIGNED_INT_8_8_8_8: + case eGL_UNSIGNED_INT_8_8_8_8_REV: + s = 2; break; + case eGL_UNSIGNED_INT_10_10_10_2: + case eGL_UNSIGNED_INT_2_10_10_10_REV: + s = 4; break; + } + memcpy(val, data, s); + } + + m_pSerialiser->Serialise<4>("data", val); + + if(m_State <= EXECUTING) + { + m_Real.glClearBufferSubData(Target, InternalFormat, (GLintptr)Offset, (GLsizeiptr)Size, Format, Type, (const void *)&val[0]); + } + + return true; +} + +void WrappedOpenGL::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) +{ + m_Real.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERSUBDATA); + Serialise_glClearBufferSubData(target, internalformat, offset, size, format, type, data); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glClear(GLbitfield mask) { SERIALISE_ELEMENT(uint32_t, Mask, mask);