diff --git a/renderdocui/Windows/PixelHistoryView.Designer.cs b/renderdocui/Windows/PixelHistoryView.Designer.cs
index fc23ee3c9..0c2639e20 100644
--- a/renderdocui/Windows/PixelHistoryView.Designer.cs
+++ b/renderdocui/Windows/PixelHistoryView.Designer.cs
@@ -28,6 +28,7 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
TreelistView.TreeListColumn treeListColumn1 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("EID", "EID")));
TreelistView.TreeListColumn treeListColumn2 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("Event", "Event")));
TreelistView.TreeListColumn treeListColumn3 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("Before", "Before")));
@@ -37,8 +38,12 @@
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.historyContext = new System.Windows.Forms.Label();
this.eventsHidden = new System.Windows.Forms.Label();
+ this.rightclickMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.hideFailedEventsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.events = new TreelistView.TreeListView();
this.tableLayoutPanel1.SuspendLayout();
+ this.rightclickMenu.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.events)).BeginInit();
this.SuspendLayout();
//
@@ -73,10 +78,35 @@
// eventsHidden
//
this.eventsHidden.AutoSize = true;
+ this.eventsHidden.ForeColor = System.Drawing.Color.Red;
this.eventsHidden.Location = new System.Drawing.Point(3, 52);
this.eventsHidden.Name = "eventsHidden";
- this.eventsHidden.Size = new System.Drawing.Size(0, 13);
+ this.eventsHidden.Size = new System.Drawing.Size(92, 13);
this.eventsHidden.TabIndex = 3;
+ this.eventsHidden.Text = "events are hidden";
+ //
+ // rightclickMenu
+ //
+ this.rightclickMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.hideFailedEventsToolStripMenuItem,
+ this.debugToolStripMenuItem});
+ this.rightclickMenu.Name = "rightclickMenu";
+ this.rightclickMenu.Size = new System.Drawing.Size(161, 48);
+ //
+ // hideFailedEventsToolStripMenuItem
+ //
+ this.hideFailedEventsToolStripMenuItem.CheckOnClick = true;
+ this.hideFailedEventsToolStripMenuItem.Name = "hideFailedEventsToolStripMenuItem";
+ this.hideFailedEventsToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+ this.hideFailedEventsToolStripMenuItem.Text = "&Hide failed events";
+ this.hideFailedEventsToolStripMenuItem.CheckedChanged += new System.EventHandler(this.hideFailedEventsToolStripMenuItem_CheckedChanged);
+ //
+ // debugToolStripMenuItem
+ //
+ this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
+ this.debugToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+ this.debugToolStripMenuItem.Text = "&Debug pixel";
+ this.debugToolStripMenuItem.Click += new System.EventHandler(this.debugToolStripMenuItem_Click);
//
// events
//
@@ -104,7 +134,7 @@
treeListColumn4,
treeListColumn5,
treeListColumn6});
- this.events.Cursor = System.Windows.Forms.Cursors.Arrow;
+ this.events.Cursor = System.Windows.Forms.Cursors.VSplit;
this.events.Dock = System.Windows.Forms.DockStyle.Fill;
this.events.Location = new System.Drawing.Point(3, 68);
this.events.MultiSelect = false;
@@ -117,6 +147,7 @@
this.events.ViewOptions.ShowLine = false;
this.events.ViewOptions.ShowPlusMinus = false;
this.events.NodeDoubleClicked += new TreelistView.TreeListView.NodeDoubleClickedHandler(this.events_NodeDoubleClicked);
+ this.events.MouseClick += new System.Windows.Forms.MouseEventHandler(this.events_MouseClick);
//
// PixelHistoryView
//
@@ -130,6 +161,7 @@
this.Text = "Pixel History";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
+ this.rightclickMenu.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.events)).EndInit();
this.ResumeLayout(false);
@@ -141,5 +173,8 @@
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label historyContext;
private System.Windows.Forms.Label eventsHidden;
+ private System.Windows.Forms.ContextMenuStrip rightclickMenu;
+ private System.Windows.Forms.ToolStripMenuItem hideFailedEventsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs
index 9a9716148..701d9cafc 100644
--- a/renderdocui/Windows/PixelHistoryView.cs
+++ b/renderdocui/Windows/PixelHistoryView.cs
@@ -40,6 +40,12 @@ namespace renderdocui.Windows
public partial class PixelHistoryView : DockContent, ILogViewerForm
{
Core m_Core;
+ FetchTexture texture;
+ Point pixel;
+ PixelModification[] modifications;
+ bool[] visibleChannels;
+ float rangeMin, rangeMax;
+ int numChannels, channelIdx;
public PixelHistoryView(Core core, FetchTexture tex, Point pt,
float rangemin, float rangemax, bool[] channels,
@@ -49,16 +55,20 @@ namespace renderdocui.Windows
Icon = global::renderdocui.Properties.Resources.icon;
- events.BeginInit();
- events.BeginUpdate();
-
m_Core = core;
+ texture = tex;
+ pixel = pt;
+ modifications = history;
+ rangeMin = rangemin;
+ rangeMax = rangemax;
+ visibleChannels = channels;
+
Text = String.Format("Pixel History on {0} for ({1}, {2})", tex.name, pt.X, pt.Y);
string channelStr = "";
- int numChannels = 0;
- int channelIdx = 0;
+ numChannels = 0;
+ channelIdx = 0;
if (channels[0])
{
@@ -95,28 +105,40 @@ namespace renderdocui.Windows
historyContext.Text = String.Format("Preview colours displayed in visible range {0} - {1} with {2} visible.",
Formatter.Format(rangemin), Formatter.Format(rangemax), channelStr) + Environment.NewLine;
historyContext.Text += Environment.NewLine;
+ historyContext.Text += "Double click to jump to an event." + Environment.NewLine;
historyContext.Text += "Right click to debug an event, or hide failed events.";
- bool uintTex = (tex.format.compType == FormatComponentType.UInt);
- bool sintTex = (tex.format.compType == FormatComponentType.SInt);
- bool srgbTex = tex.format.srgbCorrected ||
- (tex.creationFlags & TextureCreationFlags.SwapBuffer) > 0;
+ eventsHidden.Text = "";
+
+ UpdateEventList();
+ }
+
+ void UpdateEventList()
+ {
+ events.BeginUpdate();
+
+ events.Nodes.Clear();
+
+ bool uintTex = (texture.format.compType == FormatComponentType.UInt);
+ bool sintTex = (texture.format.compType == FormatComponentType.SInt);
+ bool srgbTex = texture.format.srgbCorrected ||
+ (texture.creationFlags & TextureCreationFlags.SwapBuffer) > 0;
bool floatTex = (!uintTex && !sintTex);
- int numComps = (int)tex.format.compCount;
+ int numComps = (int)texture.format.compCount;
- if (tex.format.compType == FormatComponentType.Depth ||
- (tex.format.special && tex.format.specialFormat == SpecialFormat.D24S8) ||
- (tex.format.special && tex.format.specialFormat == SpecialFormat.D32S8))
+ if (texture.format.compType == FormatComponentType.Depth ||
+ (texture.format.special && texture.format.specialFormat == SpecialFormat.D24S8) ||
+ (texture.format.special && texture.format.specialFormat == SpecialFormat.D32S8))
numComps = 0;
- float rangesize = (rangemax - rangemin);
+ float rangesize = (rangeMax - rangeMin);
- foreach (PixelModification mod in history)
+ foreach (PixelModification mod in modifications)
{
string name = "name";
- var drawcall = core.GetDrawcall(core.CurFrame, mod.eventID);
+ var drawcall = m_Core.GetDrawcall(m_Core.CurFrame, mod.eventID);
if (drawcall == null) continue;
@@ -155,6 +177,9 @@ namespace renderdocui.Windows
passed = false;
}
+ if(!passed && hideFailedEventsToolStripMenuItem.Checked)
+ continue;
+
string preModVal = "";
string postModVal = "";
@@ -223,17 +248,17 @@ namespace renderdocui.Windows
}
else
{
- if (!channels[0]) r = 0.0f;
- if (!channels[1]) g = 0.0f;
- if (!channels[2]) b = 0.0f;
+ if (!visibleChannels[0]) r = 0.0f;
+ if (!visibleChannels[1]) g = 0.0f;
+ if (!visibleChannels[2]) b = 0.0f;
}
- r = Helpers.Clamp((r - rangemin) / rangesize, 0.0f, 1.0f);
- g = Helpers.Clamp((g - rangemin) / rangesize, 0.0f, 1.0f);
- b = Helpers.Clamp((b - rangemin) / rangesize, 0.0f, 1.0f);
+ r = Helpers.Clamp((r - rangeMin) / rangesize, 0.0f, 1.0f);
+ g = Helpers.Clamp((g - rangeMin) / rangesize, 0.0f, 1.0f);
+ b = Helpers.Clamp((b - rangeMin) / rangesize, 0.0f, 1.0f);
if(numComps == 0)
- r = g = b = Helpers.Clamp((mod.preMod.depth - rangemin) / rangesize, 0.0f, 1.0f);
+ r = g = b = Helpers.Clamp((mod.preMod.depth - rangeMin) / rangesize, 0.0f, 1.0f);
if (srgbTex)
{
@@ -254,17 +279,17 @@ namespace renderdocui.Windows
}
else
{
- if (!channels[0]) r = 0.0f;
- if (!channels[1]) g = 0.0f;
- if (!channels[2]) b = 0.0f;
+ if (!visibleChannels[0]) r = 0.0f;
+ if (!visibleChannels[1]) g = 0.0f;
+ if (!visibleChannels[2]) b = 0.0f;
}
- r = Helpers.Clamp((r - rangemin) / rangesize, 0.0f, 1.0f);
- g = Helpers.Clamp((g - rangemin) / rangesize, 0.0f, 1.0f);
- b = Helpers.Clamp((b - rangemin) / rangesize, 0.0f, 1.0f);
+ r = Helpers.Clamp((r - rangeMin) / rangesize, 0.0f, 1.0f);
+ g = Helpers.Clamp((g - rangeMin) / rangesize, 0.0f, 1.0f);
+ b = Helpers.Clamp((b - rangeMin) / rangesize, 0.0f, 1.0f);
if (numComps == 0)
- r = g = b = Helpers.Clamp((mod.postMod.depth - rangemin) / rangesize, 0.0f, 1.0f);
+ r = g = b = Helpers.Clamp((mod.postMod.depth - rangeMin) / rangesize, 0.0f, 1.0f);
if (srgbTex)
{
@@ -280,7 +305,6 @@ namespace renderdocui.Windows
}
events.EndUpdate();
- events.EndInit();
}
public void OnLogfileClosed()
@@ -303,5 +327,58 @@ namespace renderdocui.Windows
m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag);
}
}
+
+ private void events_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Right)
+ {
+ rightclickMenu.Show(events.PointToScreen(e.Location));
+ }
+ }
+
+ private void debugToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (events.SelectedNode == null) return;
+
+ var node = events.SelectedNode;
+
+ if (node.Tag is uint)
+ {
+ m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag);
+
+ ShaderDebugTrace trace = null;
+
+ ShaderReflection shaderDetails = m_Core.CurPipelineState.GetShaderReflection(ShaderStageType.Pixel);
+
+ m_Core.Renderer.Invoke((ReplayRenderer r) =>
+ {
+ trace = r.PSGetDebugStates((UInt32)pixel.X, (UInt32)pixel.Y);
+ });
+
+ if (trace == null || trace.states.Length == 0)
+ {
+ MessageBox.Show("Error debugging pixel.", "Debug Error",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ this.BeginInvoke(new Action(() =>
+ {
+ ShaderViewer s = new ShaderViewer(m_Core, shaderDetails, ShaderStageType.Pixel, trace);
+
+ s.Show(this.DockPanel);
+ }));
+ }
+ }
+
+ private void hideFailedEventsToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
+ {
+ if (hideFailedEventsToolStripMenuItem.Checked)
+ eventsHidden.Text = "Failed events are currently hidden";
+ else
+ eventsHidden.Text = "";
+
+ UpdateEventList();
+ }
}
}
diff --git a/renderdocui/Windows/PixelHistoryView.resx b/renderdocui/Windows/PixelHistoryView.resx
index 1af7de150..77e2d8337 100644
--- a/renderdocui/Windows/PixelHistoryView.resx
+++ b/renderdocui/Windows/PixelHistoryView.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file