Added visualization of rasterizer state for OpenGL.

This commit is contained in:
valeriog
2014-10-31 19:40:16 +01:00
parent 63d1f868ac
commit d18557239f
9 changed files with 527 additions and 357 deletions
+37
View File
@@ -89,6 +89,43 @@ struct GLPipelineState
};
rdctype::array<Buffer> UniformBuffers;
struct Rasterizer
{
struct Viewport
{
Viewport() : Left(0.0f), Bottom(0.0f), Width(0.0f), Height(0.0f), MinDepth(0.0f), MaxDepth(0.0f) {}
float Left, Bottom;
float Width, Height;
double MinDepth, MaxDepth;
};
rdctype::array<Viewport> Viewports;
struct Scissor
{
Scissor() : Left(0), Bottom(0), Width(0), Height(0), Enabled(false) {}
int32_t Left, Bottom;
int32_t Width, Height;
bool32 Enabled;
};
rdctype::array<Scissor> Scissors;
struct RasterizerState
{
RasterizerState()
: FillMode(eFill_Solid), CullMode(eCull_None), FrontCCW(false), DepthBias(0),
SlopeScaledDepthBias(0.0f), DepthClamp(false),
MultisampleEnable(false), AntialiasedLineEnable(false) {}
TriangleFillMode FillMode;
TriangleCullMode CullMode;
bool32 FrontCCW;
float DepthBias;
float SlopeScaledDepthBias;
bool32 DepthClamp;
bool32 MultisampleEnable;
bool32 AntialiasedLineEnable;
} m_State;
} m_Rasterizer;
struct FrameBuffer
{
FrameBuffer() : FBO(), Depth(), Stencil() {}
+2
View File
@@ -346,6 +346,7 @@ enum TriangleFillMode
{
eFill_Solid = 0,
eFill_Wireframe,
eFill_Point,
};
enum TriangleCullMode
@@ -353,6 +354,7 @@ enum TriangleCullMode
eCull_None = 0,
eCull_Front,
eCull_Back,
eCull_FrontAndBack,
};
enum ReplayCreateStatus
+12 -3
View File
@@ -70,7 +70,6 @@ void GLRenderState::FetchState()
eGL_SAMPLE_ALPHA_TO_ONE,
eGL_SAMPLE_COVERAGE,
eGL_SAMPLE_MASK,
eGL_SCISSOR_TEST,
eGL_STENCIL_TEST,
eGL_TEXTURE_CUBE_MAP_SEAMLESS,
};
@@ -153,7 +152,10 @@ void GLRenderState::FetchState()
m_Real->glGetFloati_v(eGL_VIEWPORT, i, &Viewports[i].x);
for(GLuint i=0; i < (GLuint)ARRAY_COUNT(Scissors); i++)
{
m_Real->glGetIntegeri_v(eGL_SCISSOR_BOX, i, &Scissors[i].x);
Scissors[i].enabled = (m_Real->glIsEnabledi(eGL_SCISSOR_TEST, i) == GL_TRUE);
}
m_Real->glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, (GLint *)&DrawFBO);
m_Real->glGetIntegerv(eGL_READ_FRAMEBUFFER_BINDING, (GLint *)&ReadFBO);
@@ -256,7 +258,6 @@ void GLRenderState::ApplyState()
eGL_SAMPLE_ALPHA_TO_ONE,
eGL_SAMPLE_COVERAGE,
eGL_SAMPLE_MASK,
eGL_SCISSOR_TEST,
eGL_STENCIL_TEST,
eGL_TEXTURE_CUBE_MAP_SEAMLESS,
};
@@ -329,7 +330,15 @@ void GLRenderState::ApplyState()
m_Real->glViewportArrayv(0, ARRAY_COUNT(Viewports), &Viewports[0].x);
m_Real->glScissorArrayv(0, ARRAY_COUNT(Scissors), &Scissors[0].x);
for (GLuint s = 0; s < (GLuint)ARRAY_COUNT(Scissors); ++s)
{
m_Real->glScissorIndexedv(s, &Scissors[s].x);
if (Scissors[s].enabled)
m_Real->glEnablei(eGL_SCISSOR_TEST, s);
else
m_Real->glDisablei(eGL_SCISSOR_TEST, s);
}
m_Real->glBindFramebuffer(eGL_READ_FRAMEBUFFER, ReadFBO);
m_Real->glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, DrawFBO);
+2 -1
View File
@@ -67,7 +67,7 @@ struct GLRenderState
eEnabled_SampleAlphaToOne,
eEnabled_SampleCoverage,
eEnabled_SampleMask,
eEnabled_ScissorTest,
//eEnabled_ScissorTest, handled below with scissor values
eEnabled_StencilTest,
eEnabled_TexCubeSeamless,
eEnabled_Count,
@@ -131,6 +131,7 @@ struct GLRenderState
struct Scissor
{
int32_t x, y, width, height;
bool enabled;
} Scissors[16];
GLuint ReadFBO, DrawFBO;
+84
View File
@@ -1093,6 +1093,90 @@ void GLReplay::SavePipelineState()
}
}
// Vertex post processing and rasterization
RDCCOMPILE_ASSERT(ARRAY_COUNT(rs.Viewports) == ARRAY_COUNT(rs.DepthRanges), "GL Viewport count does not match depth ranges count");
create_array_uninit(pipe.m_Rasterizer.Viewports, ARRAY_COUNT(rs.Viewports));
for (int32_t v = 0; v < pipe.m_Rasterizer.Viewports.count; ++v)
{
pipe.m_Rasterizer.Viewports[v].Left = rs.Viewports[v].x;
pipe.m_Rasterizer.Viewports[v].Bottom = rs.Viewports[v].y;
pipe.m_Rasterizer.Viewports[v].Width = rs.Viewports[v].width;
pipe.m_Rasterizer.Viewports[v].Height = rs.Viewports[v].height;
pipe.m_Rasterizer.Viewports[v].MinDepth = rs.DepthRanges[v].nearZ;
pipe.m_Rasterizer.Viewports[v].MaxDepth = rs.DepthRanges[v].farZ;
}
create_array_uninit(pipe.m_Rasterizer.Scissors, ARRAY_COUNT(rs.Scissors));
for (int32_t s = 0; s < pipe.m_Rasterizer.Scissors.count; ++s)
{
pipe.m_Rasterizer.Scissors[s].Left = rs.Scissors[s].x;
pipe.m_Rasterizer.Scissors[s].Bottom = rs.Scissors[s].y;
pipe.m_Rasterizer.Scissors[s].Width = rs.Scissors[s].width;
pipe.m_Rasterizer.Scissors[s].Height = rs.Scissors[s].height;
pipe.m_Rasterizer.Scissors[s].Enabled = rs.Scissors[s].enabled;
}
int polygonOffsetEnableEnum;
switch (rs.PolygonMode)
{
default:
RDCWARN("Unexpected value for POLYGON_MODE");
case eGL_FILL:
pipe.m_Rasterizer.m_State.FillMode = eFill_Solid;
polygonOffsetEnableEnum = GLRenderState::eEnabled_PolyOffsetFill;
break;
case eGL_LINES:
pipe.m_Rasterizer.m_State.FillMode = eFill_Wireframe;
polygonOffsetEnableEnum = GLRenderState::eEnabled_PolyOffsetLine;
break;
case eGL_POINT:
pipe.m_Rasterizer.m_State.FillMode = eFill_Point;
polygonOffsetEnableEnum = GLRenderState::eEnabled_PolyOffsetPoint;
break;
}
if (rs.Enabled[polygonOffsetEnableEnum])
{
pipe.m_Rasterizer.m_State.DepthBias = rs.PolygonOffset[1];
pipe.m_Rasterizer.m_State.SlopeScaledDepthBias = rs.PolygonOffset[0];
}
else
{
pipe.m_Rasterizer.m_State.DepthBias = 0.0f;
pipe.m_Rasterizer.m_State.SlopeScaledDepthBias = 0.0f;
}
if (rs.Enabled[GLRenderState::eEnabled_CullFace])
{
switch (rs.CullFace)
{
default:
RDCWARN("Unexpected value for CULL_FACE");
case eGL_BACK:
pipe.m_Rasterizer.m_State.CullMode = eCull_Back;
break;
case eGL_FRONT:
pipe.m_Rasterizer.m_State.CullMode = eCull_Front;
break;
case eGL_FRONT_AND_BACK:
pipe.m_Rasterizer.m_State.CullMode = eCull_FrontAndBack;
break;
}
}
else
{
pipe.m_Rasterizer.m_State.CullMode = eCull_None;
}
RDCASSERT(rs.FrontFace == eGL_CCW || rs.FrontFace == eGL_CW);
pipe.m_Rasterizer.m_State.FrontCCW = rs.FrontFace == eGL_CCW;
pipe.m_Rasterizer.m_State.DepthClamp = rs.Enabled[GLRenderState::eEnabled_DepthClamp];
pipe.m_Rasterizer.m_State.MultisampleEnable = rs.Enabled[GLRenderState::eEnabled_Multisample];
pipe.m_Rasterizer.m_State.AntialiasedLineEnable = rs.Enabled[GLRenderState::eEnabled_LineSmooth];
// Frame buffer
GLuint curFBO = 0;
gl.glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, (GLint*)&curFBO);
+2
View File
@@ -351,6 +351,7 @@ namespace renderdoc
{
Solid = 0,
Wireframe,
Point
};
public enum TriangleCullMode
@@ -358,6 +359,7 @@ namespace renderdoc
None = 0,
Front,
Back,
FrontAndBack,
};
public enum ReplayCreateStatus
+41
View File
@@ -119,6 +119,47 @@ namespace renderdoc
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
public Buffer[] UniformBuffers;
[StructLayout(LayoutKind.Sequential)]
public class Rasterizer
{
[StructLayout(LayoutKind.Sequential)]
public class Viewport
{
public float Left, Bottom;
public float Width, Height;
public double MinDepth, MaxDepth;
};
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
public Viewport[] Viewports;
[StructLayout(LayoutKind.Sequential)]
public class Scissor
{
public Int32 Left, Bottom;
public Int32 Width, Height;
public bool Enabled;
};
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
public Scissor[] Scissors;
[StructLayout(LayoutKind.Sequential)]
public class RasterizerState
{
public TriangleFillMode FillMode;
public TriangleCullMode CullMode;
public bool FrontCCW;
public float DepthBias;
public float SlopeScaledDepthBias;
public bool DepthClamp;
public bool MultisampleEnable;
public bool AntialiasedLineEnable;
};
[CustomMarshalAs(CustomUnmanagedType.CustomClass)]
public RasterizerState m_State;
};
[CustomMarshalAs(CustomUnmanagedType.CustomClass)]
public Rasterizer m_RS;
[StructLayout(LayoutKind.Sequential)]
public class FrameBuffer
{
File diff suppressed because it is too large Load Diff
@@ -118,8 +118,7 @@ namespace renderdocui.Windows.PipelineState
multisampleEnable.Image = tick;
depthClip.Image = tick;
depthBias.Text = "0";
depthBiasClamp.Text = "0.0";
depthBias.Text = "0.0";
slopeScaledBias.Text = "0.0";
viewports.Nodes.Clear();
@@ -613,14 +612,63 @@ namespace renderdocui.Windows.PipelineState
viewports.BeginUpdate();
viewports.Nodes.Clear();
if (state.m_RS.Viewports != null)
{
int i = 0;
foreach (var v in state.m_RS.Viewports)
{
if (v.Width != v.Height || v.Width != 0 || v.Height != 0 || showEmpty.Checked)
{
var node = viewports.Nodes.Add(new object[] { i, v.Left, v.Bottom, v.Width, v.Height, v.MinDepth, v.MaxDepth });
if (v.Width == v.Height && v.Width == 0 && v.Height == 0)
EmptyRow(node);
}
i++;
}
}
viewports.NodesSelection.Clear();
viewports.EndUpdate();
bool anyScissorEnable = false;
scissors.BeginUpdate();
scissors.Nodes.Clear();
if (state.m_RS.Scissors != null)
{
int i = 0;
foreach (var s in state.m_RS.Scissors)
{
if (s.Width != 0 || s.Height != 0 || showEmpty.Checked)
{
var node = scissors.Nodes.Add(new object[] { i, s.Left, s.Bottom, s.Width, s.Height, s.Enabled });
if (s.Width == 0 && s.Height == 0)
EmptyRow(node);
}
if (s.Enabled)
anyScissorEnable = true;
i++;
}
}
scissors.NodesSelection.Clear();
scissors.EndUpdate();
fillMode.Text = state.m_RS.m_State.FillMode.ToString();
cullMode.Text = state.m_RS.m_State.CullMode.ToString();
frontCCW.Image = state.m_RS.m_State.FrontCCW ? tick : cross;
scissorEnable.Image = anyScissorEnable ? tick : cross;
lineAAEnable.Image = state.m_RS.m_State.AntialiasedLineEnable ? tick : cross;
multisampleEnable.Image = state.m_RS.m_State.MultisampleEnable ? tick : cross;
depthClip.Image = state.m_RS.m_State.DepthClamp ? cross : tick;
depthBias.Text = Formatter.Format(state.m_RS.m_State.DepthBias);
slopeScaledBias.Text = Formatter.Format(state.m_RS.m_State.SlopeScaledDepthBias);
////////////////////////////////////////////////
// Output Merger