From 459c3b5aa37d5ca695f8f6c632ea905d643910fe Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 25 May 2014 18:17:00 +0100 Subject: [PATCH] Serialise out glBindBuffer{Base,Range} and glBindFramebuffer --- renderdoc/driver/gl/gl_common.h | 3 ++ renderdoc/driver/gl/gl_context_driver.cpp | 29 +++++++++++++ renderdoc/driver/gl/gl_device_driver.cpp | 50 ++++++++++++++++++++--- renderdoc/driver/gl/gl_driver.cpp | 16 ++++++++ 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index cd8d91a85..0aa585bc5 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -132,9 +132,12 @@ enum GLChunkType GEN_FRAMEBUFFERS, FRAMEBUFFER_TEX, + BIND_FRAMEBUFFER, GEN_BUFFER, BIND_BUFFER, + BIND_BUFFER_BASE, + BIND_BUFFER_RANGE, BUFFERDATA, GEN_VERTEXARRAY, BIND_VERTEXARRAY, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index 6fc4b3fbd..eac1cea69 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -182,8 +182,37 @@ void WrappedOpenGL::glPolygonMode(GLenum face, GLenum mode) m_Real.glPolygonMode(face, mode); } +bool WrappedOpenGL::Serialise_glBindFramebuffer(GLenum target, GLuint framebuffer) +{ + SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(ResourceId, Id, GetResourceManager()->GetID(FramebufferRes(framebuffer))); + + if(m_State <= EXECUTING) + { + if(Id == ResourceId()) + { + m_Real.glBindFramebuffer(Target, m_FakeBB_FBO); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(Id); + m_Real.glBindFramebuffer(Target, res.name); + } + } + + return true; +} + void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer) { + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(BIND_FRAMEBUFFER); + Serialise_glBindFramebuffer(target, framebuffer); + + m_ContextRecord->AddChunk(scope.Get()); + } + if(framebuffer == 0 && (m_State == READING || m_State == EXECUTING)) framebuffer = m_FakeBB_FBO; diff --git a/renderdoc/driver/gl/gl_device_driver.cpp b/renderdoc/driver/gl/gl_device_driver.cpp index 25b6435b1..bc5485b0c 100644 --- a/renderdoc/driver/gl/gl_device_driver.cpp +++ b/renderdoc/driver/gl/gl_device_driver.cpp @@ -1113,21 +1113,59 @@ void WrappedOpenGL::glBufferData(GLenum target, GLsizeiptr size, const void *dat } } +bool WrappedOpenGL::Serialise_glBindBufferBase(GLenum target, GLuint index, GLuint buffer) +{ + SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(uint32_t, Index, index); + SERIALISE_ELEMENT(ResourceId, id, m_BufferRecord[BufferIdx(target)]->GetResourceID()); + + if(m_State < WRITING) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindBufferBase(Target, Index, res.name); + } + + return true; +} + void WrappedOpenGL::glBindBufferBase(GLenum target, GLuint index, GLuint buffer) { - if(m_State >= WRITING) + if(m_State == WRITING_CAPFRAME) { - RDCUNIMPLEMENTED(); + SCOPED_SERIALISE_CONTEXT(BIND_BUFFER_BASE); + Serialise_glBindBufferBase(target, index, buffer); + + m_ContextRecord->AddChunk(scope.Get()); } m_Real.glBindBufferBase(target, index, buffer); } +bool WrappedOpenGL::Serialise_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) +{ + SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(uint32_t, Index, index); + SERIALISE_ELEMENT(ResourceId, id, m_BufferRecord[BufferIdx(target)]->GetResourceID()); + SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset); + SERIALISE_ELEMENT(uint64_t, Size, (uint64_t)size); + + if(m_State < WRITING) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindBufferRange(Target, Index, res.name, (GLintptr)Offset, (GLsizeiptr)Size); + } + + return true; +} + void WrappedOpenGL::glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { - if(m_State >= WRITING) + if(m_State == WRITING_CAPFRAME) { - RDCUNIMPLEMENTED(); + SCOPED_SERIALISE_CONTEXT(BIND_BUFFER_RANGE); + Serialise_glBindBufferRange(target, index, buffer, offset, size); + + m_ContextRecord->AddChunk(scope.Get()); } m_Real.glBindBufferRange(target, index, buffer, offset, size); @@ -1163,7 +1201,7 @@ bool WrappedOpenGL::Serialise_glVertexAttribPointer(GLuint index, GLint size, GL SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)pointer); SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); - if(m_State == READING) + if(m_State < WRITING) { if(id != ResourceId()) { @@ -1200,7 +1238,7 @@ bool WrappedOpenGL::Serialise_glEnableVertexAttribArray(GLuint index) { SERIALISE_ELEMENT(GLuint, Index, index); - if(m_State == READING) + if(m_State < WRITING) { m_Real.glEnableVertexAttribArray(Index); } diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 59709ac39..1f7b65df0 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -89,9 +89,12 @@ const char *GLChunkNames[] = "glGenFramebuffers", "glFramebufferTexture", + "glBindFramebuffer", "glGenBuffers", "glBindBuffer", + "glBindBufferBase", + "glBindBufferRange", "glBufferData", "glGenVertexArrays", "glBindVertexArray", @@ -843,6 +846,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case GEN_TEXTURE: Serialise_glGenTextures(0, NULL); break; + case ACTIVE_TEXTURE: + Serialise_glActiveTexture(eGL_UNKNOWN_ENUM); + break; case BIND_TEXTURE: Serialise_glBindTexture(eGL_UNKNOWN_ENUM, 0); break; @@ -939,6 +945,10 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) break; // + case BIND_FRAMEBUFFER: + Serialise_glBindFramebuffer(eGL_UNKNOWN_ENUM, 0); + break; + case CLEAR: Serialise_glClear(0); break; @@ -979,6 +989,12 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case BIND_BUFFER: Serialise_glBindBuffer(eGL_UNKNOWN_ENUM, 0); break; + case BIND_BUFFER_BASE: + Serialise_glBindBufferBase(eGL_UNKNOWN_ENUM, 0, 0); + break; + case BIND_BUFFER_RANGE: + Serialise_glBindBufferRange(eGL_UNKNOWN_ENUM, 0, 0, 0, 0); + break; case BUFFERDATA: Serialise_glBufferData(eGL_UNKNOWN_ENUM, 0, NULL, eGL_UNKNOWN_ENUM); break;