mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-28 09:26:52 +00:00
Added visualization of rasterizer state for OpenGL.
This commit is contained in:
@@ -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() {}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
+297
-351
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user