diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index f712d625d..3ca2a8098 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -279,7 +279,7 @@ bool WrappedOpenGL::Serialise_glDepthFunc(GLenum func) if(m_State <= EXECUTING) { - m_Real.glDepthFunc(func); + m_Real.glDepthFunc(f); } return true; diff --git a/renderdoc/driver/gl/gl_device_driver.cpp b/renderdoc/driver/gl/gl_device_driver.cpp index 627682488..b2897e81d 100644 --- a/renderdoc/driver/gl/gl_device_driver.cpp +++ b/renderdoc/driver/gl/gl_device_driver.cpp @@ -102,10 +102,17 @@ bool WrappedOpenGL::Serialise_glBindTexture(GLenum target, GLuint texture) } else if(m_State < WRITING) { - GLResource res = GetResourceManager()->GetLiveResource(Id); - m_Real.glBindTexture(Target, res.name); + if(Id == ResourceId()) + { + m_Real.glBindTexture(Target, 0); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(Id); + m_Real.glBindTexture(Target, res.name); - m_Textures[GetResourceManager()->GetLiveID(Id)].curType = Target; + m_Textures[GetResourceManager()->GetLiveID(Id)].curType = Target; + } } return true; @@ -277,9 +284,12 @@ bool WrappedOpenGL::Serialise_glTexParameteri(GLenum target, GLenum pname, GLint SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(GLenum, PName, pname); SERIALISE_ELEMENT(int32_t, Param, param); + SERIALISE_ELEMENT(ResourceId, id, m_TextureRecord[m_TextureUnit]->GetResourceID()); if(m_State < WRITING) { + if(m_State == READING) + m_Real.glBindTexture(Target, GetResourceManager()->GetLiveResource(id).name); glTexParameteri(Target, PName, Param); } @@ -711,9 +721,40 @@ bool WrappedOpenGL::Serialise_glFramebufferTexture(GLenum target, GLenum attachm SERIALISE_ELEMENT(GLenum, Attach, attachment); SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(texture))); SERIALISE_ELEMENT(int32_t, Level, level); + + ResourceId curFrameBuffer; + + if(m_State == WRITING_IDLE) + { + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(m_DrawFramebufferRecord) + curFrameBuffer = m_DrawFramebufferRecord->GetResourceID(); + } + else + { + if(m_ReadFramebufferRecord) + curFrameBuffer = m_ReadFramebufferRecord->GetResourceID(); + } + } + + SERIALISE_ELEMENT(ResourceId, fbid, curFrameBuffer); if(m_State < WRITING) { + if(m_State == READING) + { + if(fbid != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(fbid); + m_Real.glBindFramebuffer(Target, res.name); + } + else + { + m_Real.glBindFramebuffer(Target, 0); + } + } + GLResource res = GetResourceManager()->GetLiveResource(id); glFramebufferTexture(Target, Attach, res.name, Level); } @@ -735,16 +776,16 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) { if(m_DrawFramebufferRecord) - m_DeviceRecord->AddChunk(scope.Get()); - else m_DrawFramebufferRecord->AddChunk(scope.Get()); + else + m_DeviceRecord->AddChunk(scope.Get()); } else { if(m_ReadFramebufferRecord) - m_DeviceRecord->AddChunk(scope.Get()); - else m_ReadFramebufferRecord->AddChunk(scope.Get()); + else + m_DeviceRecord->AddChunk(scope.Get()); } } else @@ -755,9 +796,22 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin bool WrappedOpenGL::Serialise_glReadBuffer(GLenum mode) { SERIALISE_ELEMENT(GLenum, m, mode); + SERIALISE_ELEMENT(ResourceId, id, m_ReadFramebufferRecord ? m_ReadFramebufferRecord->GetResourceID() : ResourceId()); if(m_State < WRITING) + { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindFramebuffer(eGL_READ_FRAMEBUFFER, res.name); + } + else + { + m_Real.glBindFramebuffer(eGL_READ_FRAMEBUFFER, 0); + } + m_Real.glReadBuffer(m); + } return true; } @@ -1864,7 +1918,10 @@ bool WrappedOpenGL::Serialise_glUnmapBuffer(GLenum target) if(m_State == READING) { - m_Real.glBindBufferRange(eGL_UNIFORM_BUFFER, 0, oldBuf, (GLintptr)oldBufBase, (GLsizeiptr)oldBufSize); + if(oldBufBase == 0 && oldBufSize == 0) + m_Real.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, oldBuf); + else + m_Real.glBindBufferRange(eGL_UNIFORM_BUFFER, 0, oldBuf, (GLintptr)oldBufBase, (GLsizeiptr)oldBufSize); } } @@ -1985,9 +2042,20 @@ void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type, bool WrappedOpenGL::Serialise_glEnableVertexAttribArray(GLuint index) { SERIALISE_ELEMENT(uint32_t, Index, index); + SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); if(m_State < WRITING) { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindVertexArray(res.name); + } + else + { + m_Real.glBindVertexArray(0); + } + m_Real.glEnableVertexAttribArray(Index); } return true; @@ -2012,9 +2080,20 @@ void WrappedOpenGL::glEnableVertexAttribArray(GLuint index) bool WrappedOpenGL::Serialise_glDisableVertexAttribArray(GLuint index) { SERIALISE_ELEMENT(uint32_t, Index, index); + SERIALISE_ELEMENT(ResourceId, id, m_VertexArrayRecord ? m_VertexArrayRecord->GetResourceID() : ResourceId()); if(m_State < WRITING) { + if(id != ResourceId()) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + m_Real.glBindVertexArray(res.name); + } + else + { + m_Real.glBindVertexArray(0); + } + m_Real.glDisableVertexAttribArray(Index); } return true; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 1b1797bdb..5530ef5a8 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1138,6 +1138,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case UNIFORM_VECTOR: Serialise_glUniformVector(0, 0, NULL, UNIFORM_UNKNOWN); break; + case DRAWARRAYS: + Serialise_glDrawArrays(eGL_UNKNOWN_ENUM, 0, 0); + break; case DRAWARRAYS_INSTANCEDBASEDINSTANCE: Serialise_glDrawArraysInstancedBaseInstance(eGL_UNKNOWN_ENUM, 0, 0, 0, 0); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index ab207c6b5..219887122 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -99,7 +99,7 @@ class WrappedOpenGL { ((WrappedOpenGL *)userParam)->DebugSnoop(source, type, id, severity, length, message); } // state - GLResourceRecord *m_TextureRecord[128]; + GLResourceRecord *m_TextureRecord[128]; // TODO this needs on per texture type :( GLResourceRecord *m_BufferRecord[16]; GLResourceRecord *m_VertexArrayRecord; GLResourceRecord *m_DrawFramebufferRecord; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index d967962cb..936bc4863 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -489,6 +489,9 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) case eGL_ELEMENT_ARRAY_BUFFER: ret.creationFlags = eBufferCreate_IB; break; + case eGL_UNIFORM_BUFFER: + ret.creationFlags = eBufferCreate_CB; + break; default: RDCERR("Unexpected buffer type %hs", ToStr::Get(res.curType).c_str()); } diff --git a/renderdoc/replay/replay_enums.h b/renderdoc/replay/replay_enums.h index 9661bbe9b..582c4dc73 100644 --- a/renderdoc/replay/replay_enums.h +++ b/renderdoc/replay/replay_enums.h @@ -201,6 +201,7 @@ enum BufferCreationFlags { eBufferCreate_VB = 0x1, eBufferCreate_IB = 0x2, + eBufferCreate_CB = 0x4, }; enum TextureCreationFlags diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 816ac811d..9ad026dd0 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -204,6 +204,7 @@ namespace renderdoc { VB = 0x1, IB = 0x2, + CB = 0x4, }; [Flags]