From 28c176839762657d374a76bb42d866656308680f Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 22 Jul 2016 14:40:40 +0200 Subject: [PATCH] Add menu item to jump from pixel history modifications to each primitive --- renderdocui/Code/Core.cs | 12 ++ renderdocui/Interop/Enums.cs | 9 ++ renderdocui/Windows/BufferViewer.cs | 6 +- renderdocui/Windows/MainWindow.cs | 6 +- .../PipelineState/D3D11PipelineStateViewer.cs | 6 +- .../PipelineState/GLPipelineStateViewer.cs | 6 +- .../VulkanPipelineStateViewer.cs | 6 +- .../Windows/PixelHistoryView.Designer.cs | 114 ++++++++++-------- renderdocui/Windows/PixelHistoryView.cs | 32 ++++- 9 files changed, 134 insertions(+), 63 deletions(-) diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index 8689304aa..fd4bcbc04 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -87,6 +87,7 @@ namespace renderdocui.Code private DebugMessages m_DebugMessages = null; private TimelineBar m_TimelineBar = null; private TextureViewer m_TextureViewer = null; + private BufferViewer m_MeshViewer = null; private PipelineStateViewer m_PipelineStateViewer = null; private StatisticsViewer m_StatisticsViewer = null; @@ -782,6 +783,17 @@ namespace renderdocui.Code return m_TextureViewer; } + public BufferViewer GetMeshViewer() + { + if (m_MeshViewer == null || m_MeshViewer.IsDisposed) + { + m_MeshViewer = new BufferViewer(this, true); + AddLogViewer(m_MeshViewer); + } + + return m_MeshViewer; + } + public PipelineStateViewer GetPipelineStateViewer() { if (m_PipelineStateViewer == null || m_PipelineStateViewer.IsDisposed) diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 8afd84a65..f21851fe6 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -24,6 +24,7 @@ ******************************************************************************/ using System; +using System.Runtime.InteropServices; // from replay_enums.h @@ -520,6 +521,14 @@ namespace renderdoc public static class EnumString { + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] + private static extern UInt32 Topology_VertexOffset(PrimitiveTopology topology, UInt32 prim); + + public static UInt32 GetVertexOffset(this PrimitiveTopology topology, UInt32 primitiveIndex) + { + return Topology_VertexOffset(topology, primitiveIndex); + } + public static string Str(this DebugMessageSource source) { switch (source) diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index 99d40c227..a7b791d4f 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -761,7 +761,7 @@ namespace renderdocui.Windows public bool MeshView; - private int RowOffset + public int RowOffset { get { @@ -769,6 +769,10 @@ namespace renderdocui.Windows int.TryParse(rowOffset.Text, out row); return row; } + set + { + rowOffset.Text = value.ToString(); + } } private uint DefaultMaxRows { get { return 200000; } } diff --git a/renderdocui/Windows/MainWindow.cs b/renderdocui/Windows/MainWindow.cs index 6b0f62640..a8f72e7b8 100644 --- a/renderdocui/Windows/MainWindow.cs +++ b/renderdocui/Windows/MainWindow.cs @@ -185,7 +185,7 @@ namespace renderdocui.Windows m_Core.GetPipelineStateViewer().Show(dockPanel); - var bv = new BufferViewer(m_Core, true); + var bv = m_Core.GetMeshViewer(); bv.InitFromPersistString(""); bv.Show(dockPanel); @@ -446,7 +446,7 @@ namespace renderdocui.Windows } else if (IsPersist(persistString, typeof(BufferViewer).ToString())) { - var ret = new BufferViewer(m_Core, true); + var ret = m_Core.GetMeshViewer(); ret.InitFromPersistString(persistString); return ret; } @@ -1571,7 +1571,7 @@ namespace renderdocui.Windows private void meshOutputToolStripMenuItem_Click(object sender, EventArgs e) { - BufferViewer b = new BufferViewer(m_Core, true); + BufferViewer b = m_Core.GetMeshViewer(); b.InitFromPersistString(""); diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 52774e78e..17929a220 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -2119,7 +2119,8 @@ namespace renderdocui.Windows.PipelineState private void inputLayouts_NodeDoubleClick(TreelistView.Node node) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private D3D11PipelineState.ShaderStage GetStageForSender(object sender) @@ -2719,7 +2720,8 @@ namespace renderdocui.Windows.PipelineState private void meshView_Click(object sender, EventArgs e) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private float GetHueForVB(int i) diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index 5434a839d..0f9f4e9e9 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -1850,7 +1850,8 @@ namespace renderdocui.Windows.PipelineState private void inputLayouts_NodeDoubleClick(TreelistView.Node node) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private GLPipelineState.ShaderStage GetStageForSender(object sender) @@ -2146,7 +2147,8 @@ namespace renderdocui.Windows.PipelineState private void meshView_Click(object sender, EventArgs e) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private float GetHueForVB(int i) diff --git a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs index c98cfb7da..1141e883f 100644 --- a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs @@ -2077,7 +2077,8 @@ namespace renderdocui.Windows.PipelineState private void inputLayouts_NodeDoubleClick(TreelistView.Node node) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private VulkanPipelineState.ShaderStage GetStageForSender(object sender) @@ -2377,7 +2378,8 @@ namespace renderdocui.Windows.PipelineState private void meshView_Click(object sender, EventArgs e) { - (new BufferViewer(m_Core, true)).Show(m_DockContent.DockPanel); + var viewer = m_Core.GetMeshViewer(); + viewer.Show(m_DockContent.DockPanel); } private float GetHueForVB(int i) diff --git a/renderdocui/Windows/PixelHistoryView.Designer.cs b/renderdocui/Windows/PixelHistoryView.Designer.cs index 44f965dac..066e25a49 100644 --- a/renderdocui/Windows/PixelHistoryView.Designer.cs +++ b/renderdocui/Windows/PixelHistoryView.Designer.cs @@ -29,21 +29,22 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - TreelistView.TreeListColumn treeListColumn1 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("Event", "Event"))); - TreelistView.TreeListColumn treeListColumn2 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("Before", ""))); - TreelistView.TreeListColumn treeListColumn3 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("BeforeCol", ""))); - TreelistView.TreeListColumn treeListColumn4 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("After", ""))); - TreelistView.TreeListColumn treeListColumn5 = ((TreelistView.TreeListColumn)(new TreelistView.TreeListColumn("AfterCol", ""))); + TreelistView.TreeListColumn treeListColumn1 = new TreelistView.TreeListColumn("Event", "Event"); + TreelistView.TreeListColumn treeListColumn2 = new TreelistView.TreeListColumn("Before", ""); + TreelistView.TreeListColumn treeListColumn3 = new TreelistView.TreeListColumn("BeforeCol", ""); + TreelistView.TreeListColumn treeListColumn4 = new TreelistView.TreeListColumn("After", ""); + TreelistView.TreeListColumn treeListColumn5 = new TreelistView.TreeListColumn("AfterCol", ""); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.events = new TreelistView.TreeListView(); 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.jumpToPrimitiveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.tableLayoutPanel1.SuspendLayout(); - this.rightclickMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.events)).BeginInit(); + this.rightclickMenu.SuspendLayout(); this.SuspendLayout(); // // tableLayoutPanel1 @@ -63,50 +64,6 @@ this.tableLayoutPanel1.Size = new System.Drawing.Size(386, 478); this.tableLayoutPanel1.TabIndex = 2; // - // historyContext - // - this.historyContext.AutoSize = true; - this.historyContext.Location = new System.Drawing.Point(3, 0); - this.historyContext.Name = "historyContext"; - this.historyContext.Size = new System.Drawing.Size(378, 52); - this.historyContext.TabIndex = 2; - this.historyContext.Text = "***code overwritten preview*** Preview colours displayed in visible range {min} -" + - " {max} with {red, blue, green} channels.\r\n\r\nRight click to debug an event, or hi" + - "de failed events."; - // - // 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(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 // treeListColumn1.AutoSize = true; @@ -142,6 +99,58 @@ this.events.NodeDoubleClicked += new TreelistView.TreeListView.NodeDoubleClickedHandler(this.events_NodeDoubleClicked); this.events.MouseClick += new System.Windows.Forms.MouseEventHandler(this.events_MouseClick); // + // historyContext + // + this.historyContext.AutoSize = true; + this.historyContext.Location = new System.Drawing.Point(3, 0); + this.historyContext.Name = "historyContext"; + this.historyContext.Size = new System.Drawing.Size(378, 52); + this.historyContext.TabIndex = 2; + this.historyContext.Text = "***code overwritten preview*** Preview colours displayed in visible range {min} -" + + " {max} with {red, blue, green} channels.\r\n\r\nRight click to debug an event, hi" + + "de failed events, or jump to the modification's primitive in the mesh view."; + // + // 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(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.jumpToPrimitiveMenuItem, + this.debugToolStripMenuItem}); + this.rightclickMenu.Name = "rightclickMenu"; + this.rightclickMenu.Size = new System.Drawing.Size(161, 92); + // + // 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); + // + // jumpToPrimitiveMenuItem + // + this.jumpToPrimitiveMenuItem.Name = "jumpToPrimitiveMenuItem"; + this.jumpToPrimitiveMenuItem.Size = new System.Drawing.Size(160, 22); + this.jumpToPrimitiveMenuItem.Text = "Jump to Primitive"; + this.jumpToPrimitiveMenuItem.Click += new System.EventHandler(this.jumpToPrimitiveMenuItem_Click); + // // PixelHistoryView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -157,8 +166,8 @@ this.Leave += new System.EventHandler(this.PixelHistoryView_Leave); this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.PerformLayout(); - this.rightclickMenu.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.events)).EndInit(); + this.rightclickMenu.ResumeLayout(false); this.ResumeLayout(false); } @@ -172,5 +181,6 @@ private System.Windows.Forms.ContextMenuStrip rightclickMenu; private System.Windows.Forms.ToolStripMenuItem hideFailedEventsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jumpToPrimitiveMenuItem; } } \ No newline at end of file diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs index 68374680d..c337e1942 100644 --- a/renderdocui/Windows/PixelHistoryView.cs +++ b/renderdocui/Windows/PixelHistoryView.cs @@ -475,25 +475,55 @@ namespace renderdocui.Windows if (e.Button == MouseButtons.Right) { debugToolStripMenuItem.Enabled = false; - debugToolStripMenuItem.Text = "Debug Pixel"; + jumpToPrimitiveMenuItem.Visible = false; + if (events.SelectedNode != null && events.SelectedNode.Tag != null && events.SelectedNode.Tag is EventTag) { EventTag tag = (EventTag)events.SelectedNode.Tag; debugToolStripMenuItem.Enabled = true; if (tag.Primitive == uint.MaxValue) + { debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) at Event {3}", pixel.X, pixel.Y, tag.Primitive, tag.EID); + } else + { debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) primitive {2} at Event {3}", pixel.X, pixel.Y, tag.Primitive, tag.EID); + + jumpToPrimitiveMenuItem.Text = String.Format("Show primitive {0} at Event {1}", tag.Primitive, tag.EID); + jumpToPrimitiveMenuItem.Visible = true; + } } rightclickMenu.Show(events.PointToScreen(e.Location)); } } + private void jumpToPrimitiveMenuItem_Click(object sender, EventArgs e) + { + if (events.SelectedNode == null) return; + + var node = events.SelectedNode; + + if (node.Tag is EventTag) + { + EventTag tag = (EventTag)node.Tag; + + m_Core.SetEventID(this, tag.EID); + + UInt32 vertIdx = m_Core.CurDrawcall.topology.GetVertexOffset(tag.Primitive); + + var viewer = m_Core.GetMeshViewer(); + viewer.Show(DockPanel); + + if (!viewer.IsDisposed && vertIdx != ~0U) + viewer.RowOffset = (int)vertIdx; + } + } + private void debugToolStripMenuItem_Click(object sender, EventArgs e) { if (events.SelectedNode == null) return;