diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h index 5b2f322e0..7c3ae63b0 100644 --- a/renderdoc/api/replay/gl_pipestate.h +++ b/renderdoc/api/replay/gl_pipestate.h @@ -282,6 +282,8 @@ struct GLPipelineState FBO() : Obj(), Depth(), Stencil() {} ResourceId Obj; rdctype::array Color; + rdctype::array Layer; + rdctype::array Mip; ResourceId Depth; ResourceId Stencil; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 8948ef213..fc4227aad 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -550,7 +550,7 @@ void Serialiser::Serialise(const char *name, GLPipelineState::Rasterizer &el) Serialise("", el.Scissors); Serialise("", el.m_State); - SIZE_CHECK(GLPipelineState::FrameBuffer, 128); + SIZE_CHECK(GLPipelineState::Rasterizer, 104); } template<> @@ -625,6 +625,8 @@ void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer &el) Serialise("", el.m_DrawFBO.Obj); Serialise("", el.m_DrawFBO.Color); + Serialise("", el.m_ReadFBO.Layer); + Serialise("", el.m_ReadFBO.Mip); Serialise("", el.m_DrawFBO.Depth); Serialise("", el.m_DrawFBO.Stencil); Serialise("", el.m_DrawFBO.DrawBuffers); @@ -632,6 +634,8 @@ void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer &el) Serialise("", el.m_ReadFBO.Obj); Serialise("", el.m_ReadFBO.Color); + Serialise("", el.m_ReadFBO.Layer); + Serialise("", el.m_ReadFBO.Mip); Serialise("", el.m_ReadFBO.Depth); Serialise("", el.m_ReadFBO.Stencil); Serialise("", el.m_ReadFBO.DrawBuffers); @@ -639,7 +643,7 @@ void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer &el) Serialise("", el.m_Blending); - SIZE_CHECK(GLPipelineState::FrameBuffer, 128); + SIZE_CHECK(GLPipelineState::FrameBuffer, 160); } template<> @@ -673,7 +677,7 @@ void Serialiser::Serialise(const char *name, GLPipelineState &el) Serialise("", el.m_Hints); - SIZE_CHECK(GLPipelineState, 952); + SIZE_CHECK(GLPipelineState, 984); } #pragma endregion OpenGL pipeline state diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 6a052cbc0..ece029d9d 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1662,9 +1662,18 @@ void GLReplay::SavePipelineState() pipe.m_FB.m_DrawFBO.Obj = rm->GetOriginalID(rm->GetID(FramebufferRes(ctx, curDrawFBO))); create_array_uninit(pipe.m_FB.m_DrawFBO.Color, numCols); + create_array_uninit(pipe.m_FB.m_DrawFBO.Layer, numCols); + create_array_uninit(pipe.m_FB.m_DrawFBO.Mip, numCols); for(GLint i=0; i < numCols; i++) + { pipe.m_FB.m_DrawFBO.Color[i] = rm->GetOriginalID(rm->GetID(rbCol[i] ? RenderbufferRes(ctx, curCol[i]) : TextureRes(ctx, curCol[i]))); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_DrawFBO.Mip[i]); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_DrawFBO.Layer[i]); + if(pipe.m_FB.m_DrawFBO.Layer[i] == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_DrawFBO.Layer[i]); + } + pipe.m_FB.m_DrawFBO.Depth = rm->GetOriginalID(rm->GetID(rbDepth ? RenderbufferRes(ctx, curDepth) : TextureRes(ctx, curDepth))); pipe.m_FB.m_DrawFBO.Stencil = rm->GetOriginalID(rm->GetID(rbStencil ? RenderbufferRes(ctx, curStencil) : TextureRes(ctx, curStencil))); @@ -1700,9 +1709,18 @@ void GLReplay::SavePipelineState() pipe.m_FB.m_ReadFBO.Obj = rm->GetOriginalID(rm->GetID(FramebufferRes(ctx, curReadFBO))); create_array_uninit(pipe.m_FB.m_ReadFBO.Color, numCols); + create_array_uninit(pipe.m_FB.m_ReadFBO.Layer, numCols); + create_array_uninit(pipe.m_FB.m_ReadFBO.Mip, numCols); for(GLint i=0; i < numCols; i++) + { pipe.m_FB.m_ReadFBO.Color[i] = rm->GetOriginalID(rm->GetID(rbCol[i] ? RenderbufferRes(ctx, curCol[i]) : TextureRes(ctx, curCol[i]))); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_ReadFBO.Mip[i]); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_ReadFBO.Layer[i]); + if(pipe.m_FB.m_ReadFBO.Layer[i] == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_ReadFBO.Layer[i]); + } + pipe.m_FB.m_ReadFBO.Depth = rm->GetOriginalID(rm->GetID(rbDepth ? RenderbufferRes(ctx, curDepth) : TextureRes(ctx, curDepth))); pipe.m_FB.m_ReadFBO.Stencil = rm->GetOriginalID(rm->GetID(rbStencil ? RenderbufferRes(ctx, curStencil) : TextureRes(ctx, curStencil))); diff --git a/renderdocui/Interop/GLPipelineState.cs b/renderdocui/Interop/GLPipelineState.cs index ef16feba6..a67dfd797 100644 --- a/renderdocui/Interop/GLPipelineState.cs +++ b/renderdocui/Interop/GLPipelineState.cs @@ -320,6 +320,10 @@ namespace renderdoc [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public ResourceId[] Color; + [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] + public UInt32[] Layer; + [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] + public UInt32[] Mip; public ResourceId Depth; public ResourceId Stencil;