Fix up fetching layer/mip for FBOs on replay

This commit is contained in:
baldurk
2015-07-18 18:27:34 +02:00
parent e5c1f8ee3b
commit 8213281921
8 changed files with 120 additions and 47 deletions
+10 -5
View File
@@ -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<ResourceId> Color;
rdctype::array<uint32_t> Layer;
rdctype::array<uint32_t> Mip;
ResourceId Depth;
ResourceId Stencil;
rdctype::array<Attachment> Color;
Attachment Depth;
Attachment Stencil;
rdctype::array<int32_t> DrawBuffers;
int32_t ReadBuffer;
+10 -4
View File
@@ -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);
+1
View File
@@ -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);
+56 -22
View File
@@ -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;
+5 -5
View File
@@ -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;
+11 -7
View File
@@ -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;
@@ -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)
{
+25 -2
View File
@@ -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;
}