A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using NameAndTooltip = UnityEngine.Rendering.DebugUI.Widget.NameAndTooltip;
3
4namespace UnityEngine.Rendering.RenderGraphModule
5{
6 class RenderGraphDebugParams : IDebugDisplaySettingsQuery
7 {
8 DebugUI.Widget[] m_DebugItems;
9 DebugUI.Panel m_DebugPanel;
10
11 public bool clearRenderTargetsAtCreation;
12 public bool clearRenderTargetsAtRelease;
13 public bool disablePassCulling;
14 public bool immediateMode;
15 public bool enableLogging;
16 public bool logFrameInformation;
17 public bool logResources;
18
19 internal void Reset()
20 {
21 clearRenderTargetsAtCreation = false;
22 clearRenderTargetsAtRelease = false;
23 disablePassCulling = false;
24 immediateMode = false;
25 enableLogging = false;
26 logFrameInformation = false;
27 logResources = false;
28 }
29
30 private static class Strings
31 {
32 public static readonly NameAndTooltip ClearRenderTargetsAtCreation = new() { name = "Clear Render Targets At Creation", tooltip = "Enable to clear all render textures before any rendergraph passes to check if some clears are missing." };
33 public static readonly NameAndTooltip ClearRenderTargetsAtFree = new() { name = "Clear Render Targets When Freed", tooltip = "Enable to clear all render textures when textures are freed by the graph to detect use after free of textures." };
34 public static readonly NameAndTooltip DisablePassCulling = new() { name = "Disable Pass Culling", tooltip = "Enable to temporarily disable culling to assess if a pass is culled." };
35 public static readonly NameAndTooltip ImmediateMode = new() { name = "Immediate Mode", tooltip = "Enable to force render graph to execute all passes in the order you registered them." };
36 public static readonly NameAndTooltip EnableLogging = new() { name = "Enable Logging", tooltip = "Enable to allow HDRP to capture information in the log." };
37 public static readonly NameAndTooltip LogFrameInformation = new() { name = "Log Frame Information", tooltip = "Enable to log information output from each frame." };
38 public static readonly NameAndTooltip LogResources = new() { name = "Log Resources", tooltip = "Enable to log the current render graph's global resource usage." };
39 public static readonly NameAndTooltip EnableNativeCompiler = new() { name = "Enable Native Pass Compiler", tooltip = "Enable the new native pass compiler." };
40 }
41
42 internal List<DebugUI.Widget> GetWidgetList(string name)
43 {
44 var list = new List<DebugUI.Widget>
45 {
46 new DebugUI.Container
47 {
48 displayName = $"{name} Render Graph",
49 children =
50 {
51 new DebugUI.BoolField
52 {
53 nameAndTooltip = Strings.ClearRenderTargetsAtCreation,
54 getter = () => clearRenderTargetsAtCreation,
55 setter = value => clearRenderTargetsAtCreation = value
56 },
57 new DebugUI.BoolField
58 {
59 nameAndTooltip = Strings.ClearRenderTargetsAtFree,
60 getter = () => clearRenderTargetsAtRelease,
61 setter = value => clearRenderTargetsAtRelease = value
62 },
63 // We cannot expose this option as it will change the active render target and the debug menu won't know where to render itself anymore.
64 // list.Add(new DebugUI.BoolField { displayName = "Clear Render Targets at release", getter = () => clearRenderTargetsAtRelease, setter = value => clearRenderTargetsAtRelease = value });
65 new DebugUI.BoolField
66 {
67 nameAndTooltip = Strings.DisablePassCulling,
68 getter = () => disablePassCulling,
69 setter = value => disablePassCulling = value
70 },
71 new DebugUI.BoolField
72 {
73 nameAndTooltip = Strings.ImmediateMode,
74 getter = () => immediateMode,
75 setter = value => immediateMode = value,
76 // [UUM-64948] Temporarily disable for URP while we implement support for Immediate Mode in the RenderGraph
77 isHiddenCallback = () => !IsImmediateModeSupported()
78 },
79 new DebugUI.BoolField
80 {
81 nameAndTooltip = Strings.EnableLogging,
82 getter = () => enableLogging,
83 setter = value => enableLogging = value
84 },
85 new DebugUI.Button
86 {
87 nameAndTooltip = Strings.LogFrameInformation,
88 action = () =>
89 {
90 if (!enableLogging)
91 Debug.Log("You must first enable logging before logging frame information.");
92 logFrameInformation = true;
93#if UNITY_EDITOR
94 UnityEditor.SceneView.RepaintAll();
95#endif
96 }
97 },
98 new DebugUI.Button
99 {
100 nameAndTooltip = Strings.LogResources,
101 action = () =>
102 {
103 if (!enableLogging)
104 Debug.Log("You must first enable logging before logging resources.");
105 logResources = true;
106#if UNITY_EDITOR
107 UnityEditor.SceneView.RepaintAll();
108#endif
109 }
110 }
111 }
112 }
113 };
114
115 return list;
116 }
117
118 private bool IsImmediateModeSupported()
119 {
120 return GraphicsSettings.currentRenderPipeline is IRenderGraphEnabledRenderPipeline rgPipeline &&
121 rgPipeline.isImmediateModeSupported;
122 }
123
124 public void RegisterDebug(string name, DebugUI.Panel debugPanel = null)
125 {
126 var list = GetWidgetList(name);
127 m_DebugItems = list.ToArray();
128 m_DebugPanel = debugPanel != null ? debugPanel : DebugManager.instance.GetPanel(name.Length == 0 ? "Render Graph" : name, true);
129 m_DebugPanel.children.Add(m_DebugItems);
130 }
131
132 public void UnRegisterDebug(string name)
133 {
134 //DebugManager.instance.RemovePanel(name.Length == 0 ? "Render Graph" : name);
135 if ( m_DebugPanel != null ) m_DebugPanel.children.Remove(m_DebugItems);
136 m_DebugPanel = null;
137 m_DebugItems = null;
138 }
139
140 public bool AreAnySettingsActive
141 {
142 get
143 {
144 return clearRenderTargetsAtCreation ||
145 clearRenderTargetsAtRelease ||
146 disablePassCulling ||
147 immediateMode ||
148 enableLogging;
149 }
150 }
151 }
152}