From 6fa46b359eab60fee64131e8101b92a7af146e27 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 3 Aug 2014 15:54:40 +0100 Subject: [PATCH] Implement right click options to debug or hide failed events --- .../Windows/PixelHistoryView.Designer.cs | 39 ++++- renderdocui/Windows/PixelHistoryView.cs | 139 ++++++++++++++---- renderdocui/Windows/PixelHistoryView.resx | 3 + 3 files changed, 148 insertions(+), 33 deletions(-) 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