Add selection of primitive to pixel debug from pixel history

* This means when multiple fragments are writing to a pixel you can choose
  precisely the one you want to debug, rather than the debugging always
  running the approximately last fragment to pass
This commit is contained in:
baldurk
2014-09-25 10:49:01 +01:00
parent 672bd14af9
commit 0261095de6
17 changed files with 113 additions and 80 deletions
+9 -9
View File
@@ -213,11 +213,11 @@ namespace renderdoc
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, IntPtr history);
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern bool ReplayRenderer_VSGetDebugStates(IntPtr real, UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset, IntPtr outtrace);
private static extern bool ReplayRenderer_DebugVertex(IntPtr real, UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset, IntPtr outtrace);
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern bool ReplayRenderer_PSGetDebugStates(IntPtr real, UInt32 x, UInt32 y, IntPtr outtrace);
private static extern bool ReplayRenderer_DebugPixel(IntPtr real, UInt32 x, UInt32 y, UInt32 sample, UInt32 primitive, IntPtr outtrace);
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern bool ReplayRenderer_CSGetDebugStates(IntPtr real, UInt32[] groupid, UInt32[] threadid, IntPtr outtrace);
private static extern bool ReplayRenderer_DebugThread(IntPtr real, UInt32[] groupid, UInt32[] threadid, IntPtr outtrace);
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern bool ReplayRenderer_GetUsage(IntPtr real, ResourceId id, IntPtr outusage);
@@ -506,11 +506,11 @@ namespace renderdoc
return ret;
}
public ShaderDebugTrace VSGetDebugStates(UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset)
public ShaderDebugTrace DebugVertex(UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset)
{
IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace));
bool success = ReplayRenderer_VSGetDebugStates(m_Real, vertid, instid, idx, instOffset, vertOffset, mem);
bool success = ReplayRenderer_DebugVertex(m_Real, vertid, instid, idx, instOffset, vertOffset, mem);
ShaderDebugTrace ret = null;
@@ -522,11 +522,11 @@ namespace renderdoc
return ret;
}
public ShaderDebugTrace PSGetDebugStates(UInt32 x, UInt32 y)
public ShaderDebugTrace DebugPixel(UInt32 x, UInt32 y, UInt32 sample, UInt32 primitive)
{
IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace));
bool success = ReplayRenderer_PSGetDebugStates(m_Real, x, y, mem);
bool success = ReplayRenderer_DebugPixel(m_Real, x, y, sample, primitive, mem);
ShaderDebugTrace ret = null;
@@ -538,11 +538,11 @@ namespace renderdoc
return ret;
}
public ShaderDebugTrace CSGetDebugStates(UInt32[] groupid, UInt32[] threadid)
public ShaderDebugTrace DebugThread(UInt32[] groupid, UInt32[] threadid)
{
IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace));
bool success = ReplayRenderer_CSGetDebugStates(m_Real, groupid, threadid, mem);
bool success = ReplayRenderer_DebugThread(m_Real, groupid, threadid, mem);
ShaderDebugTrace ret = null;
+1 -1
View File
@@ -2172,7 +2172,7 @@ namespace renderdocui.Windows
m_Core.Renderer.Invoke((ReplayRenderer r) =>
{
trace = r.VSGetDebugStates((UInt32)row, (UInt32)m_CurInst, idx, draw.instanceOffset, draw.vertexOffset);
trace = r.DebugVertex((UInt32)row, (UInt32)m_CurInst, idx, draw.instanceOffset, draw.vertexOffset);
});
this.BeginInvoke(new Action(() =>
@@ -2030,7 +2030,7 @@ namespace renderdocui.Windows.PipelineState
m_Core.Renderer.Invoke((ReplayRenderer r) =>
{
trace = r.CSGetDebugStates(new uint[] { gx, gy, gz }, new uint[] { tx, ty, tz });
trace = r.DebugThread(new uint[] { gx, gy, gz }, new uint[] { tx, ty, tz });
});
if (trace == null || trace.states.Length == 0)
+27 -10
View File
@@ -39,9 +39,22 @@ namespace renderdocui.Windows
{
public partial class PixelHistoryView : DockContent, ILogViewerForm
{
struct EventTag
{
public EventTag(uint eid, uint prim)
{
EID = eid;
Primitive = prim;
}
public uint EID;
public uint Primitive;
};
Core m_Core;
FetchTexture texture;
Point pixel;
uint sample;
PixelModification[] modifications;
bool[] visibleChannels;
float rangeMin, rangeMax;
@@ -61,6 +74,7 @@ namespace renderdocui.Windows
rangeMin = rangemin;
rangeMax = rangemax;
visibleChannels = channels;
sample = 0;
Text = String.Format("Pixel History on {0} for ({1}, {2})", tex.name, pt.X, pt.Y);
@@ -276,7 +290,7 @@ namespace renderdocui.Windows
node = new TreelistView.Node(new object[] { name, shadOutVal, "", postModVal, "" });
}
node.Tag = mod.eventID;
node.Tag = new EventTag(mod.eventID, mod.uavWrite ? uint.MaxValue : mod.primitiveID);
if (floatTex || depth)
{
@@ -360,7 +374,7 @@ namespace renderdocui.Windows
var node = new TreelistView.Node(new object[] { name, preModVal, "", postModVal, "" });
node.DefaultBackColor = passed ? Color.FromArgb(235, 255, 235) : Color.FromArgb(255, 235, 235);
node.Tag = mods[0].eventID;
node.Tag = new EventTag(mods[0].eventID, uint.MaxValue);
if (uavnowrite)
node.DefaultBackColor = Color.FromArgb(235, 235, 235);
@@ -427,9 +441,9 @@ namespace renderdocui.Windows
private void events_NodeDoubleClicked(TreelistView.Node node)
{
if (node.Tag is uint)
if (node.Tag is EventTag)
{
m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag);
m_Core.SetEventID(this, m_Core.CurFrame, ((EventTag)node.Tag).EID);
}
}
@@ -441,11 +455,12 @@ namespace renderdocui.Windows
debugToolStripMenuItem.Text = "Debug Pixel";
if (events.SelectedNode != null && events.SelectedNode.Tag != null && events.SelectedNode.Tag is uint)
if (events.SelectedNode != null && events.SelectedNode.Tag != null && events.SelectedNode.Tag is EventTag)
{
EventTag tag = (EventTag)events.SelectedNode.Tag;
debugToolStripMenuItem.Enabled = true;
debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) at Event {2}",
pixel.X, pixel.Y, (uint)events.SelectedNode.Tag);
debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) primitive {2} at Event {3}",
pixel.X, pixel.Y, tag.Primitive, tag.EID);
}
rightclickMenu.Show(events.PointToScreen(e.Location));
@@ -458,9 +473,11 @@ namespace renderdocui.Windows
var node = events.SelectedNode;
if (node.Tag is uint)
if (node.Tag is EventTag)
{
m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag);
EventTag tag = (EventTag)node.Tag;
m_Core.SetEventID(this, m_Core.CurFrame, tag.EID);
ShaderDebugTrace trace = null;
@@ -468,7 +485,7 @@ namespace renderdocui.Windows
m_Core.Renderer.Invoke((ReplayRenderer r) =>
{
trace = r.PSGetDebugStates((UInt32)pixel.X, (UInt32)pixel.Y);
trace = r.DebugPixel((UInt32)pixel.X, (UInt32)pixel.Y, sample, tag.Primitive);
});
if (trace == null || trace.states.Length == 0)
+1 -1
View File
@@ -2681,7 +2681,7 @@ namespace renderdocui.Windows
m_Core.Renderer.Invoke((ReplayRenderer r) =>
{
trace = r.PSGetDebugStates((UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y);
trace = r.DebugPixel((UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y, m_TexDisplay.sampleIdx, uint.MaxValue);
});
if (trace == null || trace.states.Length == 0)