diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index f4e9eaccb..041aeef73 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -108,20 +108,28 @@ size_t WrappedOpenGL::BufferIdx(GLenum buf) bool WrappedOpenGL::Serialise_glBindBuffer(GLenum target, GLuint buffer) { SERIALISE_ELEMENT(GLenum, Target, target); - SERIALISE_ELEMENT(ResourceId, Id, GetResourceManager()->GetID(BufferRes(buffer))); + SERIALISE_ELEMENT(ResourceId, Id, (buffer ? GetResourceManager()->GetID(BufferRes(buffer)) : ResourceId())); if(m_State >= WRITING) { size_t idx = BufferIdx(target); - m_BufferRecord[idx]->datatype = Target; + if(buffer != 0) + m_BufferRecord[idx]->datatype = Target; } else if(m_State < WRITING) { - GLResource res = GetResourceManager()->GetLiveResource(Id); - m_Real.glBindBuffer(Target, res.name); + if(Id == ResourceId()) + { + m_Real.glBindBuffer(Target, 0); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(Id); + m_Real.glBindBuffer(Target, res.name); - m_Buffers[GetResourceManager()->GetLiveID(Id)].curType = Target; + m_Buffers[GetResourceManager()->GetLiveID(Id)].curType = Target; + } } return true; @@ -131,9 +139,16 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer) { m_Real.glBindBuffer(target, buffer); + size_t idx = BufferIdx(target); + if(m_State == WRITING_CAPFRAME) { Chunk *chunk = NULL; + + if(buffer == 0) + m_BufferRecord[idx] = NULL; + else + m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(buffer)); { SCOPED_SERIALISE_CONTEXT(BIND_BUFFER); @@ -145,8 +160,6 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer) m_ContextRecord->AddChunk(chunk); } - size_t idx = BufferIdx(target); - if(buffer == 0) { m_BufferRecord[idx] = NULL; @@ -505,12 +518,19 @@ bool WrappedOpenGL::Serialise_glBindBufferBase(GLenum target, GLuint index, GLui { SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(uint32_t, Index, index); - SERIALISE_ELEMENT(ResourceId, id, m_BufferRecord[BufferIdx(target)]->GetResourceID()); + SERIALISE_ELEMENT(ResourceId, id, (buffer ? GetResourceManager()->GetID(BufferRes(buffer)) : ResourceId())); if(m_State < WRITING) { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindBufferBase(Target, Index, res.name); + if(id == ResourceId()) + { + m_Real.glBindBuffer(Target, 0); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindBufferBase(Target, Index, res.name); + } } return true; @@ -543,14 +563,21 @@ bool WrappedOpenGL::Serialise_glBindBufferRange(GLenum target, GLuint index, GLu { SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(uint32_t, Index, index); - SERIALISE_ELEMENT(ResourceId, id, m_BufferRecord[BufferIdx(target)]->GetResourceID()); + SERIALISE_ELEMENT(ResourceId, id, (buffer ? GetResourceManager()->GetID(BufferRes(buffer)) : ResourceId())); 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); + if(id == ResourceId()) + { + m_Real.glBindBuffer(Target, 0); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindBufferRange(Target, Index, res.name, (GLintptr)Offset, (GLsizeiptr)Size); + } } return true; @@ -1077,11 +1104,19 @@ void WrappedOpenGL::glGenVertexArrays(GLsizei n, GLuint *arrays) bool WrappedOpenGL::Serialise_glBindVertexArray(GLuint array) { - SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(VertexArrayRes(array))); + SERIALISE_ELEMENT(ResourceId, id, (array ? GetResourceManager()->GetID(VertexArrayRes(array)) : ResourceId())); if(m_State <= EXECUTING) { - m_Real.glBindVertexArray(GetResourceManager()->GetLiveResource(id).name); + if(id == ResourceId()) + { + m_Real.glBindVertexArray(0); + } + else + { + GLuint live = GetResourceManager()->GetLiveResource(id).name; + m_Real.glBindVertexArray(live); + } } return true; diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 3b621aa82..8661d8b9f 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -335,7 +335,7 @@ void WrappedOpenGL::glReadBuffer(GLenum mode) bool WrappedOpenGL::Serialise_glBindFramebuffer(GLenum target, GLuint framebuffer) { SERIALISE_ELEMENT(GLenum, Target, target); - SERIALISE_ELEMENT(ResourceId, Id, GetResourceManager()->GetID(FramebufferRes(framebuffer))); + SERIALISE_ELEMENT(ResourceId, Id, (framebuffer ? GetResourceManager()->GetID(FramebufferRes(framebuffer)) : ResourceId())); if(m_State <= EXECUTING) { diff --git a/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp index 32f2e8ba4..2d1a7c947 100644 --- a/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp @@ -79,12 +79,19 @@ void WrappedOpenGL::glGenSamplers(GLsizei count, GLuint *samplers) bool WrappedOpenGL::Serialise_glBindSampler(GLuint unit, GLuint sampler) { SERIALISE_ELEMENT(uint32_t, Unit, unit); - SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(SamplerRes(sampler))); + SERIALISE_ELEMENT(ResourceId, id, sampler ? GetResourceManager()->GetID(SamplerRes(sampler)) : ResourceId()); if(m_State < WRITING) { - GLResource res = GetResourceManager()->GetLiveResource(id); - glBindSampler(Unit, res.name); + if(id == ResourceId()) + { + m_Real.glBindSampler(Unit, 0); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindSampler(Unit, res.name); + } } return true; diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 927a4c4ae..0020def09 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -636,11 +636,19 @@ void WrappedOpenGL::glGenProgramPipelines(GLsizei n, GLuint *pipelines) bool WrappedOpenGL::Serialise_glBindProgramPipeline(GLuint pipeline) { - SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(ProgramPipeRes(pipeline))); + SERIALISE_ELEMENT(ResourceId, id, (pipeline ? GetResourceManager()->GetID(ProgramPipeRes(pipeline)) : ResourceId())); if(m_State <= EXECUTING) { - m_Real.glBindProgramPipeline(GetResourceManager()->GetLiveResource(id).name); + if(id == ResourceId()) + { + m_Real.glBindProgramPipeline(0); + } + else + { + GLuint live = GetResourceManager()->GetLiveResource(id).name; + m_Real.glBindProgramPipeline(live); + } } return true; diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index e2d357fa1..186f2f1b5 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -92,7 +92,7 @@ void WrappedOpenGL::glDeleteTextures(GLsizei n, const GLuint *textures) bool WrappedOpenGL::Serialise_glBindTexture(GLenum target, GLuint texture) { SERIALISE_ELEMENT(GLenum, Target, target); - SERIALISE_ELEMENT(ResourceId, Id, GetResourceManager()->GetID(TextureRes(texture))); + SERIALISE_ELEMENT(ResourceId, Id, (texture ? GetResourceManager()->GetID(TextureRes(texture)) : ResourceId())); if(m_State == WRITING_IDLE) {