From 5f206da36da231cd588757db23ca10647c002ed1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 15 Aug 2014 16:09:53 +0100 Subject: [PATCH] Add hooks for vertex attrib format/binding functions --- renderdoc/driver/gl/gl_common.h | 3 + renderdoc/driver/gl/gl_driver.cpp | 13 ++ renderdoc/driver/gl/gl_driver.h | 3 + renderdoc/driver/gl/gl_hookset.h | 3 + renderdoc/driver/gl/gl_hookset_defs.h | 6 + renderdoc/driver/gl/gl_resources.h | 2 + .../driver/gl/wrappers/gl_buffer_funcs.cpp | 154 ++++++++++++++++++ 7 files changed, 184 insertions(+) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 88e52010d..b00ebdd30 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -222,6 +222,9 @@ enum GLChunkType VERTEXATTRIBIPOINTER, ENABLEVERTEXATTRIBARRAY, DISABLEVERTEXATTRIBARRAY, + VERTEXATTRIBFORMAT, + VERTEXATTRIBIFORMAT, + VERTEXATTRIBBINDING, OBJECT_LABEL, BEGIN_EVENT, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index b18652752..003b5d130 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -179,6 +179,10 @@ const char *GLChunkNames[] = "glVertexAttribIPointer", "glEnableVertexAttribArray", "glDisableVertexAttribArray", + "glVertexAttribFormat", + "glVertexAttribIFormat", + "glVertexAttribBinding", + "glObjectLabel", "glPushDebugGroup", @@ -1339,6 +1343,15 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DISABLEVERTEXATTRIBARRAY: Serialise_glDisableVertexAttribArray(0); break; + case VERTEXATTRIBFORMAT: + Serialise_glVertexAttribFormat(0, 0, eGL_UNKNOWN_ENUM, 0, 0); + break; + case VERTEXATTRIBIFORMAT: + Serialise_glVertexAttribIFormat(0, 0, eGL_UNKNOWN_ENUM, 0); + break; + case VERTEXATTRIBBINDING: + Serialise_glVertexAttribBinding(0, 0); + break; case OBJECT_LABEL: Serialise_glObjectLabel(eGL_UNKNOWN_ENUM, 0, 0, NULL); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 63b2a8a27..522fe4edd 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -486,6 +486,9 @@ class WrappedOpenGL 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, glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexAttribBinding(GLuint attribindex, GLuint bindingindex)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)); IMPLEMENT_FUNCTION_SERIALISED(void, glEnableVertexAttribArray(GLuint index)); IMPLEMENT_FUNCTION_SERIALISED(void, glDisableVertexAttribArray(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 e7ed2b605..4bf1ebf3f 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -207,6 +207,9 @@ struct GLHookSet PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; + PFNGLVERTEXATTRIBBINDINGPROC glVertexAttribBinding; + PFNGLVERTEXATTRIBFORMATPROC glVertexAttribFormat; + PFNGLVERTEXATTRIBIFORMATPROC glVertexAttribIFormat; PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 66e83e33e..f1430b6e6 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -221,6 +221,9 @@ HookExtension(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays); \ HookExtension(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); \ HookExtension(PFNGLVERTEXATTRIBIPOINTERPROC, glVertexAttribIPointer); \ + HookExtension(PFNGLVERTEXATTRIBBINDINGPROC, glVertexAttribBinding); \ + HookExtension(PFNGLVERTEXATTRIBFORMATPROC, glVertexAttribFormat); \ + HookExtension(PFNGLVERTEXATTRIBIFORMATPROC, glVertexAttribIFormat); \ HookExtension(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation); \ HookExtension(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); \ HookExtension(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray); \ @@ -567,6 +570,9 @@ HookWrapper2(void, glDeleteVertexArrays, GLsizei, n, const GLuint *, arrays); \ HookWrapper6(void, glVertexAttribPointer, GLuint, index, GLint, size, GLenum, type, GLboolean, normalized, GLsizei, stride, const void *, pointer); \ HookWrapper5(void, glVertexAttribIPointer, GLuint, index, GLint, size, GLenum, type, GLsizei, stride, const void *, pointer); \ + HookWrapper2(void, glVertexAttribBinding, GLuint, attribindex, GLuint, bindingindex); \ + HookWrapper5(void, glVertexAttribFormat, GLuint, attribindex, GLint, size, GLenum, type, GLboolean, normalized, GLuint, relativeoffset); \ + HookWrapper4(void, glVertexAttribIFormat, GLuint, attribindex, GLint, size, GLenum, type, GLuint, relativeoffset); \ HookWrapper3(void, glBindAttribLocation, GLuint, program, GLuint, index, const GLchar *, name); \ HookWrapper1(void, glEnableVertexAttribArray, GLuint, index); \ HookWrapper1(void, glDisableVertexAttribArray, GLuint, index); \ diff --git a/renderdoc/driver/gl/gl_resources.h b/renderdoc/driver/gl/gl_resources.h index 9d1a656dc..2ae64176a 100644 --- a/renderdoc/driver/gl/gl_resources.h +++ b/renderdoc/driver/gl/gl_resources.h @@ -109,6 +109,7 @@ struct GLResourceRecord : public ResourceRecord { RDCEraseEl(ShadowPtr); RDCEraseEl(ptrchunks); + RDCEraseEl(bndchunks); RDCEraseEl(enabledchunks); } @@ -165,6 +166,7 @@ struct GLResourceRecord : public ResourceRecord } Chunk *ptrchunks[12]; + Chunk *bndchunks[12]; Chunk *enabledchunks[12]; private: diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index af2d1b5ba..51631f5c5 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -1186,6 +1186,160 @@ void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type } } +bool WrappedOpenGL::Serialise_glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) +{ + SERIALISE_ELEMENT(uint32_t, aidx, attribindex); + SERIALISE_ELEMENT(uint32_t, bidx, bindingindex); + SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); + + if(m_State < WRITING) + { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindVertexArray(res.name); + } + else + { + m_Real.glBindVertexArray(0); + } + + m_Real.glVertexAttribBinding(aidx, bidx); + } + return true; +} + +void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) +{ + m_Real.glVertexAttribBinding(attribindex, bindingindex); + + GLResourceRecord *r = m_VertexArrayRecord ? m_VertexArrayRecord : m_DeviceRecord; + if(m_State >= WRITING) + { + RDCASSERT(r); + + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING); + Serialise_glVertexAttribBinding(attribindex, bindingindex); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + r->RemoveChunk(r->bndchunks[attribindex]); + delete r->bndchunks[attribindex]; + Chunk *newchunk = r->bndchunks[attribindex] = scope.Get(); + r->AddChunk(newchunk); + } + } +} + +bool WrappedOpenGL::Serialise_glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) +{ + SERIALISE_ELEMENT(uint32_t, Index, attribindex); + SERIALISE_ELEMENT(int32_t, Size, size); + SERIALISE_ELEMENT(bool, Norm, normalized ? true : false); + SERIALISE_ELEMENT(GLenum, Type, type); + SERIALISE_ELEMENT(uint32_t, Offset, relativeoffset); + SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); + + if(m_State < WRITING) + { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindVertexArray(res.name); + } + else + { + m_Real.glBindVertexArray(0); + } + + m_Real.glVertexAttribFormat(Index, Size, Type, Norm, Offset); + } + + return true; +} + +void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) +{ + m_Real.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + + GLResourceRecord *r = m_VertexArrayRecord ? m_VertexArrayRecord : m_DeviceRecord; + if(m_State >= WRITING) + { + RDCASSERT(r); + + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT); + Serialise_glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + r->RemoveChunk(r->ptrchunks[attribindex]); + delete r->ptrchunks[attribindex]; + Chunk *newchunk = r->ptrchunks[attribindex] = scope.Get(); + r->AddChunk(newchunk); + } + } +} + +bool WrappedOpenGL::Serialise_glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +{ + SERIALISE_ELEMENT(uint32_t, Index, attribindex); + SERIALISE_ELEMENT(int32_t, Size, size); + SERIALISE_ELEMENT(GLenum, Type, type); + SERIALISE_ELEMENT(uint32_t, Offset, relativeoffset); + SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); + + if(m_State < WRITING) + { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindVertexArray(res.name); + } + else + { + m_Real.glBindVertexArray(0); + } + + m_Real.glVertexAttribIFormat(Index, Size, Type, Offset); + } + + return true; +} + +void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +{ + m_Real.glVertexAttribIFormat(attribindex, size, type, relativeoffset); + + GLResourceRecord *r = m_VertexArrayRecord ? m_VertexArrayRecord : m_DeviceRecord; + if(m_State >= WRITING) + { + RDCASSERT(r); + + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT); + Serialise_glVertexAttribIFormat(attribindex, size, type, relativeoffset); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + r->RemoveChunk(r->ptrchunks[attribindex]); + delete r->ptrchunks[attribindex]; + Chunk *newchunk = r->ptrchunks[attribindex] = scope.Get(); + r->AddChunk(newchunk); + } + } +} + bool WrappedOpenGL::Serialise_glEnableVertexAttribArray(GLuint index) { SERIALISE_ELEMENT(uint32_t, Index, index);