From d433869e3c90650c42ef624b312d719e74bc536b Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 13 Dec 2014 23:43:51 +0000 Subject: [PATCH] Make sure bind-to-create chunks don't affect object state * e.g. if the 'wrong' VAO was bound at the time we replayed a bind-to-create chunk, then we'd trample that VAO state (and it might not ever be restored). So when reading, not executing, save and restore the buffer binding. --- renderdoc/driver/gl/gl_resources.cpp | 40 +++++++++++++++++++ renderdoc/driver/gl/gl_resources.h | 2 + .../driver/gl/wrappers/gl_buffer_funcs.cpp | 9 +++++ 3 files changed, 51 insertions(+) diff --git a/renderdoc/driver/gl/gl_resources.cpp b/renderdoc/driver/gl/gl_resources.cpp index 4144f5ee2..19a0b43cb 100644 --- a/renderdoc/driver/gl/gl_resources.cpp +++ b/renderdoc/driver/gl/gl_resources.cpp @@ -608,6 +608,46 @@ GLenum TextureBinding(GLenum target) return eGL_NONE; } +GLenum BufferBinding(GLenum target) +{ + switch(target) + { + case eGL_ARRAY_BUFFER: + return eGL_ARRAY_BUFFER_BINDING; + case eGL_ATOMIC_COUNTER_BUFFER: + return eGL_ATOMIC_COUNTER_BUFFER_BINDING; + case eGL_COPY_READ_BUFFER: + return eGL_COPY_READ_BUFFER_BINDING; + case eGL_COPY_WRITE_BUFFER: + return eGL_COPY_WRITE_BUFFER_BINDING; + case eGL_DRAW_INDIRECT_BUFFER: + return eGL_DRAW_INDIRECT_BUFFER_BINDING; + case eGL_DISPATCH_INDIRECT_BUFFER: + return eGL_DISPATCH_INDIRECT_BUFFER_BINDING; + case eGL_ELEMENT_ARRAY_BUFFER: + return eGL_ELEMENT_ARRAY_BUFFER_BINDING; + case eGL_PIXEL_PACK_BUFFER: + return eGL_PIXEL_PACK_BUFFER_BINDING; + case eGL_PIXEL_UNPACK_BUFFER: + return eGL_PIXEL_UNPACK_BUFFER_BINDING; + case eGL_QUERY_BUFFER: + return eGL_QUERY_BUFFER_BINDING; + case eGL_SHADER_STORAGE_BUFFER: + return eGL_SHADER_STORAGE_BUFFER_BINDING; + case eGL_TEXTURE_BUFFER: + return eGL_TEXTURE_BUFFER_BINDING; + case eGL_TRANSFORM_FEEDBACK_BUFFER: + return eGL_TRANSFORM_FEEDBACK_BUFFER_BINDING; + case eGL_UNIFORM_BUFFER: + return eGL_UNIFORM_BUFFER_BINDING; + default: + break; + } + + RDCERR("Unexpected target %x", target); + return eGL_NONE; +} + GLenum TextureTarget(GLenum target) { switch(target) diff --git a/renderdoc/driver/gl/gl_resources.h b/renderdoc/driver/gl/gl_resources.h index 851633e61..ec2714974 100644 --- a/renderdoc/driver/gl/gl_resources.h +++ b/renderdoc/driver/gl/gl_resources.h @@ -48,6 +48,8 @@ GLenum TextureBinding(GLenum target); GLenum TextureTarget(GLenum target); bool IsProxyTarget(GLenum target); +GLenum BufferBinding(GLenum target); + enum GLNamespace { eResUnknown = 0, diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index d1d197604..4fc691c77 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -101,10 +101,19 @@ bool WrappedOpenGL::Serialise_glBindBuffer(GLenum target, GLuint buffer) } else { + // if we're just reading, make sure not to trample state (e.g. element array buffer + // binding in a VAO), since this is just a bind-to-create chunk. + GLuint prevbuf = 0; + if(m_State == READING) + m_Real.glGetIntegerv(BufferBinding(Target), (GLint *)&prevbuf); + GLResource res = GetResourceManager()->GetLiveResource(Id); m_Real.glBindBuffer(Target, res.name); m_Buffers[GetResourceManager()->GetLiveID(Id)].curType = Target; + + if(m_State == READING) + m_Real.glBindBuffer(Target, prevbuf); } }