From ac47036368bc7f27540d2fdd02ab6715684bf7d3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 9 Jan 2017 18:08:46 +0000 Subject: [PATCH] Add an option to hide any markers with only "API Calls" but no draws. --- docs/window/options_window.rst | 11 ++++ renderdoc/api/replay/replay_enums.h | 1 + renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 2 +- .../driver/d3d12/d3d12_command_list_wrap.cpp | 4 +- .../driver/gl/wrappers/gl_debug_funcs.cpp | 2 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 4 +- renderdocui/Code/PersistantConfig.cs | 1 + renderdocui/Interop/Enums.cs | 1 + .../Dialogs/SettingsDialog.Designer.cs | 47 ++++++++++++--- renderdocui/Windows/Dialogs/SettingsDialog.cs | 8 +++ renderdocui/Windows/EventBrowser.cs | 58 +++++++++++++++++-- renderdocui/Windows/TimelineBar.cs | 7 +-- 12 files changed, 123 insertions(+), 23 deletions(-) diff --git a/docs/window/options_window.rst b/docs/window/options_window.rst index d96fb4cde..14e8ae1dd 100644 --- a/docs/window/options_window.rst +++ b/docs/window/options_window.rst @@ -186,6 +186,17 @@ Marker sections that contain no API calls or drawcalls will be completely remove This option only applies itself the next time you load a log. +--------------- + + | ``Hide marker sections with only non-draw API calls`` Default: ``Disabled`` + +Marker sections that contain only miscellaneous non-draw API calls like queries or state setting will be completely removed. This also applies to the Timeline Bar. + +This can be useful if you have markers around occlusion queries or where you have a minor state change, and you don't want them cluttering up the capture. + +This option only applies itself the next time you load a log. + + --------------- | ``Apply marker colours`` Default: ``Enabled`` diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 84dbbb04c..c234fc120 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -470,6 +470,7 @@ enum DrawcallFlags eDraw_ClearDepthStencil = 0x200000, eDraw_BeginPass = 0x400000, eDraw_EndPass = 0x800000, + eDraw_APICalls = 0x1000000, }; enum SolidShadeMode diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index 279084b28..6cc0782cd 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -117,7 +117,7 @@ bool WrappedID3D11DeviceContext::Serialise_PopEvent() { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags |= eDraw_SetMarker; + draw.flags |= eDraw_SetMarker | eDraw_APICalls; AddDrawcall(draw, true); } diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 5bea18137..324a41887 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -92,7 +92,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_Close() { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags |= eDraw_SetMarker; + draw.flags |= eDraw_SetMarker | eDraw_APICalls; m_Cmd->AddDrawcall(draw, true); @@ -2570,7 +2570,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_EndEvent() { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags = eDraw_SetMarker; + draw.flags = eDraw_SetMarker | eDraw_APICalls; m_Cmd->AddDrawcall(draw, true); } diff --git a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp index a7cd4efb7..0f56086db 100644 --- a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp @@ -272,7 +272,7 @@ bool WrappedOpenGL::Serialise_glPopDebugGroup() { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags |= eDraw_SetMarker; + draw.flags |= eDraw_SetMarker | eDraw_APICalls; AddDrawcall(draw, true); } diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 28696f990..240cbe3f5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -730,7 +730,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser *localSerialiser, { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags |= eDraw_SetMarker; + draw.flags |= eDraw_SetMarker | eDraw_APICalls; AddDrawcall(draw, true); @@ -2660,7 +2660,7 @@ bool WrappedVulkan::Serialise_vkCmdDebugMarkerEndEXT(Serialiser *localSerialiser { FetchDrawcall draw; draw.name = "API Calls"; - draw.flags = eDraw_SetMarker; + draw.flags = eDraw_SetMarker | eDraw_APICalls; AddDrawcall(draw, true); } diff --git a/renderdocui/Code/PersistantConfig.cs b/renderdocui/Code/PersistantConfig.cs index b91d6ecfe..2347713b7 100644 --- a/renderdocui/Code/PersistantConfig.cs +++ b/renderdocui/Code/PersistantConfig.cs @@ -263,6 +263,7 @@ namespace renderdocui.Code public TimeUnit EventBrowser_TimeUnit = TimeUnit.Microseconds; public bool EventBrowser_HideEmpty = false; + public bool EventBrowser_HideAPICalls = false; public bool EventBrowser_ApplyColours = true; public bool EventBrowser_ColourEventRow = true; diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index cd9284e6c..5cadd9467 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -474,6 +474,7 @@ namespace renderdoc ClearDepthStencil = 0x200000, BeginPass = 0x400000, EndPass = 0x800000, + APICalls = 0x1000000, }; public enum SolidShadeMode diff --git a/renderdocui/Windows/Dialogs/SettingsDialog.Designer.cs b/renderdocui/Windows/Dialogs/SettingsDialog.Designer.cs index 71f3cf231..35d616102 100644 --- a/renderdocui/Windows/Dialogs/SettingsDialog.Designer.cs +++ b/renderdocui/Windows/Dialogs/SettingsDialog.Designer.cs @@ -54,6 +54,7 @@ System.Windows.Forms.GroupBox groupBox4; System.Windows.Forms.Label label8; System.Windows.Forms.Label label9; + System.Windows.Forms.Label label35; System.Windows.Forms.Label label16; System.Windows.Forms.Label label17; System.Windows.Forms.GroupBox groupBox7; @@ -102,6 +103,7 @@ this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel(); this.EventBrowser_TimeUnit = new System.Windows.Forms.ComboBox(); this.EventBrowser_HideEmpty = new System.Windows.Forms.CheckBox(); + this.EventBrowser_HideAPICalls = new System.Windows.Forms.CheckBox(); this.EventBrowser_ApplyColours = new System.Windows.Forms.CheckBox(); this.EventBrowser_ColourEventRow = new System.Windows.Forms.CheckBox(); this.androidTab = new System.Windows.Forms.TabPage(); @@ -137,6 +139,7 @@ groupBox4 = new System.Windows.Forms.GroupBox(); label8 = new System.Windows.Forms.Label(); label9 = new System.Windows.Forms.Label(); + label35 = new System.Windows.Forms.Label(); label16 = new System.Windows.Forms.Label(); label17 = new System.Windows.Forms.Label(); groupBox7 = new System.Windows.Forms.GroupBox(); @@ -1054,18 +1057,21 @@ this.tableLayoutPanel5.Controls.Add(this.EventBrowser_TimeUnit, 1, 0); this.tableLayoutPanel5.Controls.Add(label9, 0, 1); this.tableLayoutPanel5.Controls.Add(this.EventBrowser_HideEmpty, 1, 1); - this.tableLayoutPanel5.Controls.Add(label16, 0, 2); - this.tableLayoutPanel5.Controls.Add(label17, 0, 3); - this.tableLayoutPanel5.Controls.Add(this.EventBrowser_ApplyColours, 1, 2); - this.tableLayoutPanel5.Controls.Add(this.EventBrowser_ColourEventRow, 1, 3); + this.tableLayoutPanel5.Controls.Add(label35, 0, 2); + this.tableLayoutPanel5.Controls.Add(this.EventBrowser_HideAPICalls, 1, 2); + this.tableLayoutPanel5.Controls.Add(label16, 0, 3); + this.tableLayoutPanel5.Controls.Add(label17, 0, 4); + this.tableLayoutPanel5.Controls.Add(this.EventBrowser_ApplyColours, 1, 3); + this.tableLayoutPanel5.Controls.Add(this.EventBrowser_ColourEventRow, 1, 4); this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel5.Location = new System.Drawing.Point(3, 16); this.tableLayoutPanel5.Name = "tableLayoutPanel5"; - this.tableLayoutPanel5.RowCount = 5; + this.tableLayoutPanel5.RowCount = 6; + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel5.Size = new System.Drawing.Size(331, 383); this.tableLayoutPanel5.TabIndex = 0; @@ -1121,6 +1127,32 @@ this.EventBrowser_HideEmpty.UseVisualStyleBackColor = true; this.EventBrowser_HideEmpty.CheckedChanged += new System.EventHandler(this.EventBrowser_HideEmpty_CheckedChanged); // + // label35 + // + label35.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + label35.AutoSize = true; + label35.Location = new System.Drawing.Point(3, 30); + label35.Margin = new System.Windows.Forms.Padding(3); + label35.Name = "label35"; + label35.Size = new System.Drawing.Size(258, 14); + label35.TabIndex = 7; + label35.Text = "Hide marker sections with only non-draw API calls (requires log reload)"; + label35.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // EventBrowser_HideAPICalls + // + this.EventBrowser_HideAPICalls.AutoSize = true; + this.EventBrowser_HideAPICalls.Location = new System.Drawing.Point(267, 30); + this.EventBrowser_HideAPICalls.Name = "EventBrowser_HideAPICalls"; + this.EventBrowser_HideAPICalls.Size = new System.Drawing.Size(15, 14); + this.EventBrowser_HideAPICalls.TabIndex = 51; + this.toolTip.SetToolTip(this.EventBrowser_HideAPICalls, "In the Event Browser and Timeline Bar, marker sections that contain only non-draw " + + "API calls - e.g. only queries, or only state setting - will be completely removed"); + this.EventBrowser_HideAPICalls.UseVisualStyleBackColor = true; + this.EventBrowser_HideAPICalls.CheckedChanged += new System.EventHandler(this.EventBrowser_HideAPICalls_CheckedChanged); + // // label16 // label16.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -1402,6 +1434,7 @@ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5; private System.Windows.Forms.ComboBox EventBrowser_TimeUnit; private System.Windows.Forms.CheckBox EventBrowser_HideEmpty; + private System.Windows.Forms.CheckBox EventBrowser_HideAPICalls; private System.Windows.Forms.Button browseTempCaptureDirectory; private System.Windows.Forms.FolderBrowserDialog browserCaptureDialog; private System.Windows.Forms.CheckBox AllowGlobalHook; diff --git a/renderdocui/Windows/Dialogs/SettingsDialog.cs b/renderdocui/Windows/Dialogs/SettingsDialog.cs index 14a6a8b9f..467b48320 100644 --- a/renderdocui/Windows/Dialogs/SettingsDialog.cs +++ b/renderdocui/Windows/Dialogs/SettingsDialog.cs @@ -90,6 +90,7 @@ namespace renderdocui.Windows.Dialogs EventBrowser_TimeUnit.SelectedIndex = (int)m_Core.Config.EventBrowser_TimeUnit; EventBrowser_HideEmpty.Checked = m_Core.Config.EventBrowser_HideEmpty; + EventBrowser_HideAPICalls.Checked = m_Core.Config.EventBrowser_HideAPICalls; EventBrowser_ApplyColours.Checked = m_Core.Config.EventBrowser_ApplyColours; EventBrowser_ColourEventRow.Checked = m_Core.Config.EventBrowser_ColourEventRow; @@ -210,6 +211,13 @@ namespace renderdocui.Windows.Dialogs m_Core.Config.Serialize(Core.ConfigFilename); } + private void EventBrowser_HideAPICalls_CheckedChanged(object sender, EventArgs e) + { + m_Core.Config.EventBrowser_HideAPICalls = EventBrowser_HideAPICalls.Checked; + + m_Core.Config.Serialize(Core.ConfigFilename); + } + private void EventBrowser_ApplyColours_CheckedChanged(object sender, EventArgs e) { m_Core.Config.EventBrowser_ApplyColours = EventBrowser_ApplyColours.Checked; diff --git a/renderdocui/Windows/EventBrowser.cs b/renderdocui/Windows/EventBrowser.cs index 383246d2f..dbc947d8f 100644 --- a/renderdocui/Windows/EventBrowser.cs +++ b/renderdocui/Windows/EventBrowser.cs @@ -261,13 +261,61 @@ namespace renderdocui.Windows return GetEndDrawID(drawcall.children.Last()); } + public static bool ShouldHide(Core core, FetchDrawcall drawcall) + { + if (drawcall.flags.HasFlag(DrawcallFlags.PushMarker)) + { + if (core.Config.EventBrowser_HideEmpty) + { + if (drawcall.children == null || drawcall.children.Length == 0) + return true; + + bool allhidden = true; + + foreach (FetchDrawcall child in drawcall.children) + { + if (ShouldHide(core, child)) + continue; + + allhidden = false; + break; + } + + if (allhidden) + return true; + } + + if (core.Config.EventBrowser_HideAPICalls) + { + if (drawcall.children == null || drawcall.children.Length == 0) + return false; + + bool onlyapi = true; + + foreach (FetchDrawcall child in drawcall.children) + { + if (ShouldHide(core, child)) + continue; + + if (!child.flags.HasFlag(DrawcallFlags.APICalls)) + { + onlyapi = false; + break; + } + } + + if (onlyapi) + return true; + } + } + + return false; + } + private TreelistView.Node AddDrawcall(FetchDrawcall drawcall, TreelistView.Node root) { - if (m_Core.Config.EventBrowser_HideEmpty) - { - if ((drawcall.children == null || drawcall.children.Length == 0) && (drawcall.flags & DrawcallFlags.PushMarker) != 0) - return null; - } + if (EventBrowser.ShouldHide(m_Core, drawcall)) + return null; UInt32 eventNum = drawcall.eventID; TreelistView.Node drawNode = null; diff --git a/renderdocui/Windows/TimelineBar.cs b/renderdocui/Windows/TimelineBar.cs index a60a0047f..7ac25b27b 100644 --- a/renderdocui/Windows/TimelineBar.cs +++ b/renderdocui/Windows/TimelineBar.cs @@ -337,11 +337,8 @@ namespace renderdocui.Windows if ((d.flags & (DrawcallFlags.SetMarker | DrawcallFlags.Present)) > 0) continue; - if (m_Core.Config.EventBrowser_HideEmpty) - { - if ((d.children == null || d.children.Length == 0) && (d.flags & (DrawcallFlags.PushMarker | DrawcallFlags.MultiDraw)) != 0) - continue; - } + if(EventBrowser.ShouldHide(m_Core, d)) + continue; bool newSection = ((d.flags & (DrawcallFlags.PushMarker|DrawcallFlags.MultiDraw)) > 0 || sections.Count == 0); if (!newSection)