diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h index 7c3ae63b0..7b2c40b1f 100644 --- a/renderdoc/api/replay/gl_pipestate.h +++ b/renderdoc/api/replay/gl_pipestate.h @@ -277,15 +277,20 @@ struct GLPipelineState bool32 FramebufferSRGB; bool32 Dither; + struct Attachment + { + ResourceId Obj; + uint32_t Layer; + uint32_t Mip; + }; + struct FBO { FBO() : Obj(), Depth(), Stencil() {} ResourceId Obj; - rdctype::array Color; - rdctype::array Layer; - rdctype::array Mip; - ResourceId Depth; - ResourceId Stencil; + rdctype::array Color; + Attachment Depth; + Attachment Stencil; rdctype::array DrawBuffers; int32_t ReadBuffer; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index fc4227aad..bb4d89966 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -617,6 +617,16 @@ void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer::Blend SIZE_CHECK(GLPipelineState::FrameBuffer::BlendState, 24); } +template<> +void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer::Attachment &el) +{ + Serialise("", el.Obj); + Serialise("", el.Layer); + Serialise("", el.Mip); + + SIZE_CHECK(GLPipelineState::FrameBuffer::Attachment, 16); +} + template<> void Serialiser::Serialise(const char *name, GLPipelineState::FrameBuffer &el) { @@ -625,8 +635,6 @@ 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); @@ -634,8 +642,6 @@ 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); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 383442289..17c325cce 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -714,6 +714,7 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) m_pSerialiser = new Serialiser(4, dummy, false); } + // once GL driver is more tested, this can be disabled if(m_Real.glDebugMessageCallback) { m_Real.glDebugMessageCallback(&DebugSnoopStatic, this); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index ece029d9d..2e2406969 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -362,12 +362,12 @@ bool GLReplay::IsRenderOutput(ResourceId id) { for(int32_t i=0; i < m_CurPipelineState.m_FB.m_DrawFBO.Color.count; i++) { - if(m_CurPipelineState.m_FB.m_DrawFBO.Color[i] == id) + if(m_CurPipelineState.m_FB.m_DrawFBO.Color[i].Obj == id) return true; } - if(m_CurPipelineState.m_FB.m_DrawFBO.Depth == id || - m_CurPipelineState.m_FB.m_DrawFBO.Stencil == id) + if(m_CurPipelineState.m_FB.m_DrawFBO.Depth.Obj == id || + m_CurPipelineState.m_FB.m_DrawFBO.Stencil.Obj == id) return true; return false; @@ -1662,21 +1662,38 @@ 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]))); + pipe.m_FB.m_DrawFBO.Color[i].Obj = 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]); + if(pipe.m_FB.m_DrawFBO.Color[i].Obj != ResourceId() && !rbCol[i]) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_DrawFBO.Color[i].Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_DrawFBO.Color[i].Layer); + if(pipe.m_FB.m_DrawFBO.Color[i].Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_DrawFBO.Color[i].Layer); + } + } + + pipe.m_FB.m_DrawFBO.Depth.Obj = rm->GetOriginalID(rm->GetID(rbDepth ? RenderbufferRes(ctx, curDepth) : TextureRes(ctx, curDepth))); + pipe.m_FB.m_DrawFBO.Stencil.Obj = rm->GetOriginalID(rm->GetID(rbStencil ? RenderbufferRes(ctx, curStencil) : TextureRes(ctx, curStencil))); + + if(pipe.m_FB.m_DrawFBO.Depth.Obj != ResourceId() && !rbDepth) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_DrawFBO.Depth.Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_DrawFBO.Depth.Layer); + if(pipe.m_FB.m_DrawFBO.Depth.Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_DrawFBO.Depth.Layer); + } + + if(pipe.m_FB.m_DrawFBO.Stencil.Obj != ResourceId() && !rbStencil) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_DrawFBO.Stencil.Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_DrawFBO.Stencil.Layer); + if(pipe.m_FB.m_DrawFBO.Stencil.Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_DrawFBO.Stencil.Layer); } - 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))); - create_array_uninit(pipe.m_FB.m_DrawFBO.DrawBuffers, numCols); for(GLint i=0; i < numCols; i++) { @@ -1709,21 +1726,38 @@ 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]))); + pipe.m_FB.m_ReadFBO.Color[i].Obj = 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]); + if(pipe.m_FB.m_ReadFBO.Color[i].Obj != ResourceId() && !rbCol[i]) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_ReadFBO.Color[i].Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_ReadFBO.Color[i].Layer); + if(pipe.m_FB.m_ReadFBO.Color[i].Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_ReadFBO.Color[i].Layer); + } } - 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))); + pipe.m_FB.m_ReadFBO.Depth.Obj = rm->GetOriginalID(rm->GetID(rbDepth ? RenderbufferRes(ctx, curDepth) : TextureRes(ctx, curDepth))); + pipe.m_FB.m_ReadFBO.Stencil.Obj = rm->GetOriginalID(rm->GetID(rbStencil ? RenderbufferRes(ctx, curStencil) : TextureRes(ctx, curStencil))); + if(pipe.m_FB.m_ReadFBO.Depth.Obj != ResourceId() && !rbDepth) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_ReadFBO.Depth.Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_ReadFBO.Depth.Layer); + if(pipe.m_FB.m_ReadFBO.Depth.Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_ReadFBO.Depth.Layer); + } + + if(pipe.m_FB.m_ReadFBO.Stencil.Obj != ResourceId() && !rbStencil) + { + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, (GLint*)&pipe.m_FB.m_ReadFBO.Stencil.Mip); + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, (GLint*)&pipe.m_FB.m_ReadFBO.Stencil.Layer); + if(pipe.m_FB.m_ReadFBO.Stencil.Layer == 0) + gl.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, (GLint*)&pipe.m_FB.m_ReadFBO.Stencil.Layer); + } + create_array_uninit(pipe.m_FB.m_ReadFBO.DrawBuffers, numCols); for(GLint i=0; i < numCols; i++) pipe.m_FB.m_ReadFBO.DrawBuffers[i] = -1; diff --git a/renderdocui/Code/CommonPipelineState.cs b/renderdocui/Code/CommonPipelineState.cs index 3c62f8acc..a81cba179 100644 --- a/renderdocui/Code/CommonPipelineState.cs +++ b/renderdocui/Code/CommonPipelineState.cs @@ -585,7 +585,7 @@ namespace renderdocui.Code if (IsLogD3D11) return m_D3D11.m_OM.DepthTarget.Resource; else if (IsLogGL) - return m_GL.m_FB.m_DrawFBO.Depth; + return m_GL.m_FB.m_DrawFBO.Depth.Obj; } return ResourceId.Null; @@ -598,7 +598,7 @@ namespace renderdocui.Code if (IsLogD3D11) return m_D3D11.m_OM.DepthTarget.Resource; else if (IsLogGL) - return m_GL.m_FB.m_DrawFBO.Stencil; + return m_GL.m_FB.m_DrawFBO.Stencil.Obj; } return ResourceId.Null; @@ -648,7 +648,7 @@ namespace renderdocui.Code { int db = m_GL.m_FB.m_DrawFBO.DrawBuffers[i]; if(db >= 0) - ret[i] = m_GL.m_FB.m_DrawFBO.Color[db]; + ret[i] = m_GL.m_FB.m_DrawFBO.Color[db].Obj; } return ret; @@ -668,7 +668,7 @@ namespace renderdocui.Code return m_D3D11.m_OM.DepthTarget.Resource; if (IsLogGL) - return m_GL.m_FB.m_DrawFBO.Depth; + return m_GL.m_FB.m_DrawFBO.Depth.Obj; } return ResourceId.Null; @@ -685,7 +685,7 @@ namespace renderdocui.Code return m_D3D11.m_OM.DepthTarget.Resource; if (IsLogGL) - return m_GL.m_FB.m_DrawFBO.Stencil; + return m_GL.m_FB.m_DrawFBO.Stencil.Obj; } return ResourceId.Null; diff --git a/renderdocui/Interop/GLPipelineState.cs b/renderdocui/Interop/GLPipelineState.cs index a67dfd797..91e80717c 100644 --- a/renderdocui/Interop/GLPipelineState.cs +++ b/renderdocui/Interop/GLPipelineState.cs @@ -312,6 +312,14 @@ namespace renderdoc public class FrameBuffer { public bool FramebufferSRGB; + + [StructLayout(LayoutKind.Sequential)] + public class Attachment + { + public ResourceId Obj; + public UInt32 Layer; + public UInt32 Mip; + }; [StructLayout(LayoutKind.Sequential)] public class FBO @@ -319,13 +327,9 @@ namespace renderdoc public ResourceId Obj; [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] - public ResourceId[] Color; - [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] - public UInt32[] Layer; - [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] - public UInt32[] Mip; - public ResourceId Depth; - public ResourceId Stencil; + public Attachment[] Color; + public Attachment Depth; + public Attachment Stencil; [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public Int32[] DrawBuffers; diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index 810bc8f9a..1ee2b1138 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -1324,7 +1324,7 @@ namespace renderdocui.Windows.PipelineState { ResourceId p = ResourceId.Null; - if (db >= 0) p = state.m_FB.m_DrawFBO.Color[db]; + if (db >= 0) p = state.m_FB.m_DrawFBO.Color[db].Obj; if (p != ResourceId.Null || showEmpty.Checked) { @@ -1384,7 +1384,7 @@ namespace renderdocui.Windows.PipelineState { int i = 0; - foreach (ResourceId depthstencil in new ResourceId[] { state.m_FB.m_DrawFBO.Depth, state.m_FB.m_DrawFBO.Stencil }) + foreach (ResourceId depthstencil in new ResourceId[] { state.m_FB.m_DrawFBO.Depth.Obj, state.m_FB.m_DrawFBO.Stencil.Obj }) { if (depthstencil != ResourceId.Null || showEmpty.Checked) { diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index e81370b56..40b1376e5 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -112,6 +112,21 @@ namespace renderdocui.Windows return view != null ? (int)view.HighestMip : -1; } + else + { + if (Type == FollowType.OutputColour) + { + return (int)core.CurGLPipelineState.m_FB.m_DrawFBO.Color[index].Mip; + } + else if (Type == FollowType.OutputDepth) + { + return (int)core.CurGLPipelineState.m_FB.m_DrawFBO.Depth.Mip; + } + else if (Type == FollowType.ReadWriteRes) + { + return (int)core.CurGLPipelineState.Images[index].Level; + } + } return -1; } @@ -144,12 +159,20 @@ namespace renderdocui.Windows } else { - if (Type == FollowType.ReadWriteRes) + if (Type == FollowType.OutputColour) + { + return (int)core.CurGLPipelineState.m_FB.m_DrawFBO.Color[index].Layer; + } + else if (Type == FollowType.OutputDepth) + { + return (int)core.CurGLPipelineState.m_FB.m_DrawFBO.Depth.Layer; + } + else if (Type == FollowType.ReadWriteRes) { if(!core.CurGLPipelineState.Images[index].Layered) return (int)core.CurGLPipelineState.Images[index].Layer; } - if (Type == FollowType.PSResource) + else if (Type == FollowType.PSResource) { return (int)core.CurGLPipelineState.Textures[index].FirstSlice; }