diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 46ce76fbb..703cef324 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -57,6 +57,7 @@ struct VAOInitialData { VertexAttribInitialData VertexAttribs[16]; VertexBufferInitialData VertexBuffers[16]; + ResourceId ElementArrayBuffer; }; template<> @@ -288,6 +289,10 @@ bool GLResourceManager::Prepare_InitialState(GLResource res) gl.glGetIntegeri_v(eGL_VERTEX_BINDING_DIVISOR, i, (GLint *)&data->VertexBuffers[i].Divisor); } + GLuint buffer = 0; + gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&buffer); + data->ElementArrayBuffer = GetID(BufferRes(res.Context, buffer)); + SetInitialContents(Id, InitialContentData(GLResource(MakeNullResource), 0, (byte *)data)); gl.glBindVertexArray(VAO); @@ -738,6 +743,7 @@ bool GLResourceManager::Serialise_InitialState(GLResource res) m_pSerialiser->Serialise("VertexAttrib[]", data.VertexAttribs[i]); m_pSerialiser->Serialise("VertexBuffer[]", data.VertexBuffers[i]); } + m_pSerialiser->Serialise("ElementArrayBuffer", data.ElementArrayBuffer); if(m_State < WRITING) { @@ -864,6 +870,9 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i gl.glBindVertexBuffer(i, buffer, (GLintptr)buf.Offset, (GLsizei)buf.Stride); gl.glVertexBindingDivisor(i, buf.Divisor); } + + GLuint buffer = initialdata->ElementArrayBuffer == ResourceId() ? 0 : GetLiveResource(initialdata->ElementArrayBuffer).name; + gl.glBindBuffer(eGL_ELEMENT_ARRAY_BUFFER, buffer); gl.glBindVertexArray(VAO); } diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 6afee9e0e..12ca21174 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -157,7 +157,6 @@ void GLRenderState::FetchState() m_Real->glGetIntegerv(eGL_COPY_WRITE_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Copy_Write]); m_Real->glGetIntegerv(eGL_DRAW_INDIRECT_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Draw_Indirect]); m_Real->glGetIntegerv(eGL_DISPATCH_INDIRECT_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Dispatch_Indirect]); - m_Real->glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Element_Array]); m_Real->glGetIntegerv(eGL_PIXEL_PACK_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Pixel_Pack]); m_Real->glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Pixel_Unpack]); m_Real->glGetIntegerv(eGL_QUERY_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Query]); @@ -381,7 +380,6 @@ void GLRenderState::ApplyState() m_Real->glBindBuffer(eGL_COPY_WRITE_BUFFER, BufferBindings[eBufIdx_Copy_Write]); m_Real->glBindBuffer(eGL_DRAW_INDIRECT_BUFFER, BufferBindings[eBufIdx_Draw_Indirect]); m_Real->glBindBuffer(eGL_DISPATCH_INDIRECT_BUFFER, BufferBindings[eBufIdx_Dispatch_Indirect]); - m_Real->glBindBuffer(eGL_ELEMENT_ARRAY_BUFFER, BufferBindings[eBufIdx_Element_Array]); m_Real->glBindBuffer(eGL_PIXEL_PACK_BUFFER, BufferBindings[eBufIdx_Pixel_Pack]); m_Real->glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, BufferBindings[eBufIdx_Pixel_Unpack]); m_Real->glBindBuffer(eGL_QUERY_BUFFER, BufferBindings[eBufIdx_Query]); diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 803ab2d9e..8fe042ef0 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -99,7 +99,6 @@ struct GLRenderState eBufIdx_Copy_Write, eBufIdx_Draw_Indirect, eBufIdx_Dispatch_Indirect, - eBufIdx_Element_Array, eBufIdx_Pixel_Pack, eBufIdx_Pixel_Unpack, eBufIdx_Query, diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 3e40241cf..dee2b4e38 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -785,7 +785,9 @@ void GLReplay::SavePipelineState() void *ctx = m_ReplayCtx.ctx; - pipe.m_VtxIn.ibuffer.Buffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, rs.BufferBindings[GLRenderState::eBufIdx_Element_Array]))); + GLuint ibuffer = 0; + gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer); + pipe.m_VtxIn.ibuffer.Buffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, ibuffer))); // Vertex buffers and attributes GLint numVBufferBindings = 16; diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index af0612c13..5d2c95aa6 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -160,6 +160,15 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer) r->AddChunk(chunk); } + + // element array buffer binding is vertex array record state, record there (if we've not just stopped) + if(m_State == WRITING_IDLE && target == eGL_ELEMENT_ARRAY_BUFFER && m_VertexArrayRecord && VertexArrayUpdateCheck()) + { + SCOPED_SERIALISE_CONTEXT(BIND_BUFFER); + Serialise_glBindBuffer(target, buffer); + + m_VertexArrayRecord->AddChunk(scope.Get()); + } } }