Add shader subroutines (placeholder) and transform feedback

* The transform feedback is placed on the geometry shader tab the same as
  in D3D11. It doesn't merit its own whole tab and that seemed like the
  best place to put it (last processing stage before rasterization).
* To aid understanding, further stages are marked disabled if rasterizer
  discard is on, and if no geometry shader is bound the stage is renamed.
This commit is contained in:
baldurk
2015-01-18 12:06:39 +00:00
parent 3b2d45131b
commit 48f98ebdef
4 changed files with 940 additions and 806 deletions
@@ -1014,7 +1014,7 @@ namespace renderdocui.Windows.PipelineState
gsStreams.SetVScrollValue(vs);
gsStreams.Visible = gsStreams.Parent.Visible = streamoutSet;
if (gsStreams.Visible)
if (streamoutSet)
geomTableLayout.ColumnStyles[1].Width = 50.0f;
else
geomTableLayout.ColumnStyles[1].Width = 0;
File diff suppressed because it is too large Load Diff
@@ -106,7 +106,7 @@ namespace renderdocui.Windows.PipelineState
ClearShaderState(csShader, csTextures, csSamplers, csCBuffers, csSubroutines);
csUAVs.Nodes.Clear();
gsStreams.Nodes.Clear();
gsFeedback.Nodes.Clear();
var tick = global::renderdocui.Properties.Resources.tick;
var cross = global::renderdocui.Properties.Resources.cross;
@@ -505,13 +505,19 @@ namespace renderdocui.Windows.PipelineState
subs.BeginUpdate();
subs.Nodes.Clear();
{
// TODO fetch subroutines
UInt32 i = 0;
foreach (var subval in stage.Subroutines)
{
subs.Nodes.Add(new object[] { i.ToString(), subval.ToString() });
i++;
}
}
subs.EndUpdate();
subs.NodesSelection.Clear();
subs.SetVScrollValue(vs);
subs.Visible = subs.Parent.Visible = true; //(stage.Subroutines.Length > 0);
subs.Visible = subs.Parent.Visible = (stage.Subroutines.Length > 0);
}
// from https://gist.github.com/mjijackson/5311256
@@ -820,10 +826,68 @@ namespace renderdocui.Windows.PipelineState
csUAVs.NodesSelection.Clear();
csUAVs.EndUpdate();
gsStreams.BeginUpdate();
gsStreams.Nodes.Clear();
gsStreams.EndUpdate();
gsStreams.NodesSelection.Clear();
vs = gsFeedback.VScrollValue();
gsFeedback.BeginUpdate();
gsFeedback.Nodes.Clear();
if (state.m_Feedback.Active)
{
feedbackPaused.Image = state.m_Feedback.Paused ? tick : cross;
for(int i=0; i < state.m_Feedback.BufferBinding.Length; i++)
{
bool filledSlot = (state.m_Feedback.BufferBinding[i] != ResourceId.Null);
bool usedSlot = (filledSlot);
// show if
if (usedSlot || // it's referenced by the shader - regardless of empty or not
(showDisabled.Checked && !usedSlot && filledSlot) || // it's bound, but not referenced, and we have "show disabled"
(showEmpty.Checked && !filledSlot) // it's empty, and we have "show empty"
)
{
string name = "Buffer " + state.m_Feedback.BufferBinding[i].ToString();
ulong length = state.m_Feedback.Size[i];
if (!filledSlot)
{
name = "Empty";
}
FetchBuffer fetch = null;
for (int t = 0; t < bufs.Length; t++)
{
if (bufs[t].ID == state.m_Feedback.BufferBinding[i])
{
name = bufs[t].name;
if(length == 0)
length = bufs[t].length;
fetch = bufs[t];
}
}
var node = gsFeedback.Nodes.Add(new object[] { i, name, length, state.m_Feedback.Offset[i] });
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
node.Tag = fetch;
if (!filledSlot)
EmptyRow(node);
if (!usedSlot)
InactiveRow(node);
}
}
}
gsFeedback.EndUpdate();
gsFeedback.NodesSelection.Clear();
gsFeedback.SetVScrollValue(vs);
gsFeedback.Visible = gsFeedback.Parent.Visible = state.m_Feedback.Active;
if (state.m_Feedback.Active)
geomTableLayout.ColumnStyles[1].Width = 50.0f;
else
geomTableLayout.ColumnStyles[1].Width = 0;
////////////////////////////////////////////////
// Rasterizer
@@ -1267,23 +1331,35 @@ namespace renderdocui.Windows.PipelineState
}
else
{
bool raster = true;
bool fbo = true;
if (state.m_VtxProcess.discard)
{
raster = fbo = false;
}
if (state.m_GS.Shader == ResourceId.Null &&
state.m_Feedback.Active)
{
pipeFlow.SetStageName(4, new KeyValuePair<string, string>("XFB", "Transform Feedback"));
}
else
{
pipeFlow.SetStageName(4, new KeyValuePair<string, string>("GS", "Geometry Shader"));
}
pipeFlow.SetStagesEnabled(new bool[] {
true,
true,
state.m_TES.Shader != ResourceId.Null,
state.m_TCS.Shader != ResourceId.Null,
state.m_GS.Shader != ResourceId.Null,
true,
state.m_FS.Shader != ResourceId.Null,
true,
state.m_GS.Shader != ResourceId.Null || state.m_Feedback.Active,
raster,
!state.m_VtxProcess.discard && state.m_FS.Shader != ResourceId.Null,
fbo,
false
});
// if(streamout only)
//{
// pipeFlow.Rasterizer = false;
// pipeFlow.OutputMerger = false;
//}
}
}
@@ -135,6 +135,21 @@
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>239, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="feedbackPaused.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<metadata name="tableLayoutPanel14.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
@@ -165,7 +180,6 @@
<metadata name="label36.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="multisampleEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m