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); } }