mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-29 21:30:53 +00:00
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.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -48,6 +48,8 @@ GLenum TextureBinding(GLenum target);
|
||||
GLenum TextureTarget(GLenum target);
|
||||
bool IsProxyTarget(GLenum target);
|
||||
|
||||
GLenum BufferBinding(GLenum target);
|
||||
|
||||
enum GLNamespace
|
||||
{
|
||||
eResUnknown = 0,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user