Skip to content

Commit 3097660

Browse files
Correctly dealloc/realloc resources when switching RenderGraph on and off. (#328)
* Handle deallocation/reallocation of resources when switching rendergraph on/off (WIP) * AO and Post Processes. * Prefixed all history buffers with camera name for readability in the memory profiler. * LIght volume debug and Volumetric (WIP) * Fixed volumetric * Fixed deallocation of SSS buffers * Review feedback fixes. * Init order fix for post process * Reverted volumetric lighting changes and now render graph version uses the shared textures.
1 parent c39bb0c commit 3097660

32 files changed

+439
-254
lines changed

com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public ref struct RenderGraphContext
3333
public RenderGraphObjectPool renderGraphPool;
3434
///<summary>Render Graph Resource Registry used for accessing resources.</summary>
3535
public RenderGraphResourceRegistry resources;
36+
///<summary>Render Graph default resources.</summary>
37+
public RenderGraphDefaultResources defaultResources;
3638
}
3739

3840
/// <summary>
@@ -50,7 +52,6 @@ public struct RenderGraphExecuteParams
5052

5153
class RenderGraphDebugParams
5254
{
53-
public bool enableRenderGraph = false; // TODO: TEMP TO REMOVE
5455
public bool tagResourceNamesWithRG;
5556
public bool clearRenderTargetsAtCreation;
5657
public bool clearRenderTargetsAtRelease;
@@ -61,16 +62,15 @@ class RenderGraphDebugParams
6162
public void RegisterDebug()
6263
{
6364
var list = new List<DebugUI.Widget>();
64-
list.Add(new DebugUI.BoolField { displayName = "Enable Render Graph", getter = () => enableRenderGraph, setter = value => enableRenderGraph = value });
6565
list.Add(new DebugUI.BoolField { displayName = "Tag Resources with RG", getter = () => tagResourceNamesWithRG, setter = value => tagResourceNamesWithRG = value });
6666
list.Add(new DebugUI.BoolField { displayName = "Clear Render Targets at creation", getter = () => clearRenderTargetsAtCreation, setter = value => clearRenderTargetsAtCreation = value });
6767
list.Add(new DebugUI.BoolField { displayName = "Clear Render Targets at release", getter = () => clearRenderTargetsAtRelease, setter = value => clearRenderTargetsAtRelease = value });
6868
list.Add(new DebugUI.BoolField { displayName = "Unbind Global Textures", getter = () => unbindGlobalTextures, setter = value => unbindGlobalTextures = value });
6969
list.Add(new DebugUI.Button { displayName = "Log Frame Information", action = () => logFrameInformation = true });
7070
list.Add(new DebugUI.Button { displayName = "Log Resources", action = () => logResources = true });
7171

72-
var testPanel = DebugManager.instance.GetPanel("Render Graph", true);
73-
testPanel.children.Add(list.ToArray());
72+
var panel = DebugManager.instance.GetPanel("Render Graph", true);
73+
panel.children.Add(list.ToArray());
7474
}
7575

7676
public void UnRegisterDebug()
@@ -194,20 +194,25 @@ internal override bool HasRenderFunc()
194194
List<RendererListHandle> m_RendererLists = new List<RendererListHandle>();
195195
RenderGraphDebugParams m_DebugParameters = new RenderGraphDebugParams();
196196
RenderGraphLogger m_Logger = new RenderGraphLogger();
197+
RenderGraphDefaultResources m_DefaultResources = new RenderGraphDefaultResources();
197198

198199
#region Public Interface
199200

200-
/// <summary>
201-
/// Returns true if rendering with Render Graph is enabled.
202-
/// </summary>
203-
public bool enabled { get { return m_DebugParameters.enableRenderGraph; } }
204-
205201
// TODO: Currently only needed by SSAO to sample correctly depth texture mips. Need to figure out a way to hide this behind a proper formalization.
206202
/// <summary>
207203
/// Gets the RTHandleProperties structure associated with the Render Graph's RTHandle System.
208204
/// </summary>
209205
public RTHandleProperties rtHandleProperties { get { return m_Resources.GetRTHandleProperties(); } }
210206

207+
public RenderGraphDefaultResources defaultResources
208+
{
209+
get
210+
{
211+
m_DefaultResources.InitializeForRendering(this);
212+
return m_DefaultResources;
213+
}
214+
}
215+
211216
/// <summary>
212217
/// Render Graph constructor.
213218
/// </summary>
@@ -224,22 +229,23 @@ public RenderGraph(bool supportMSAA, MSAASamples initialSampleCount)
224229
public void Cleanup()
225230
{
226231
m_Resources.Cleanup();
232+
m_DefaultResources.Cleanup();
227233
}
228234

229235
/// <summary>
230236
/// Register this Render Graph to the debug window.
231237
/// </summary>
232238
public void RegisterDebug()
233239
{
234-
//m_DebugParameters.RegisterDebug();
240+
m_DebugParameters.RegisterDebug();
235241
}
236242

237243
/// <summary>
238244
/// Unregister this Render Graph from the debug window.
239245
/// </summary>
240246
public void UnRegisterDebug()
241247
{
242-
//m_DebugParameters.UnRegisterDebug();
248+
m_DebugParameters.UnRegisterDebug();
243249
}
244250

245251
/// <summary>
@@ -391,6 +397,7 @@ public void Execute(ScriptableRenderContext renderContext, CommandBuffer cmd, in
391397
rgContext.renderContext = renderContext;
392398
rgContext.renderGraphPool = m_RenderGraphPool;
393399
rgContext.resources = m_Resources;
400+
rgContext.defaultResources = m_DefaultResources;
394401

395402
try
396403
{
@@ -424,6 +431,7 @@ public void Execute(ScriptableRenderContext renderContext, CommandBuffer cmd, in
424431
{
425432
ClearRenderPasses();
426433
m_Resources.Clear();
434+
m_DefaultResources.Clear();
427435
m_RendererLists.Clear();
428436

429437
if (m_DebugParameters.logFrameInformation || m_DebugParameters.logResources)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using UnityEngine.Rendering;
2+
3+
namespace UnityEngine.Experimental.Rendering.RenderGraphModule
4+
{
5+
/// <summary>
6+
/// Helper class allowing access to default resources (black or white texture, etc.) during render passes.
7+
/// </summary>
8+
public class RenderGraphDefaultResources
9+
{
10+
bool m_IsValid;
11+
12+
// We need to keep around a RTHandle version of default regular 2D textures since RenderGraph API is all RTHandle.
13+
RTHandle m_BlackTexture2D;
14+
RTHandle m_WhiteTexture2D;
15+
16+
/// <summary>Default black 2D texture.</summary>
17+
public TextureHandle blackTexture { get; private set; }
18+
/// <summary>Default white 2D texture.</summary>
19+
public TextureHandle whiteTexture { get; private set; }
20+
/// <summary>Default clear color XR 2D texture.</summary>
21+
public TextureHandle clearTextureXR { get; private set; }
22+
/// <summary>Default magenta XR 2D texture.</summary>
23+
public TextureHandle magentaTextureXR { get; private set; }
24+
/// <summary>Default black XR 2D texture.</summary>
25+
public TextureHandle blackTextureXR { get; private set; }
26+
/// <summary>Default black (UInt) XR 2D texture.</summary>
27+
public TextureHandle blackUIntTextureXR { get; private set; }
28+
/// <summary>Default black XR 3D texture.</summary>
29+
public TextureHandle blackTexture3DXR { get; private set; }
30+
/// <summary>Default white XR 2D texture.</summary>
31+
public TextureHandle whiteTextureXR { get; private set; }
32+
33+
internal RenderGraphDefaultResources()
34+
{
35+
m_BlackTexture2D = RTHandles.Alloc(Texture2D.blackTexture);
36+
m_WhiteTexture2D = RTHandles.Alloc(Texture2D.whiteTexture);
37+
}
38+
39+
internal void Cleanup()
40+
{
41+
m_BlackTexture2D.Release();
42+
m_WhiteTexture2D.Release();
43+
}
44+
45+
internal void InitializeForRendering(RenderGraph renderGraph)
46+
{
47+
if (!m_IsValid)
48+
{
49+
blackTexture = renderGraph.ImportTexture(m_BlackTexture2D);
50+
whiteTexture = renderGraph.ImportTexture(m_WhiteTexture2D);
51+
52+
clearTextureXR = renderGraph.ImportTexture(TextureXR.GetClearTexture());
53+
magentaTextureXR = renderGraph.ImportTexture(TextureXR.GetMagentaTexture());
54+
blackTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture());
55+
blackUIntTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackUIntTexture());
56+
blackTexture3DXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture3D());
57+
whiteTextureXR = renderGraph.ImportTexture(TextureXR.GetWhiteTexture());
58+
59+
m_IsValid = true;
60+
}
61+
}
62+
63+
// Imported resources are cleared everytime the Render Graph is executed, so we need to know if that happens
64+
// so that we can re-import all default resources if needed.
65+
internal void Clear()
66+
{
67+
m_IsValid = false;
68+
}
69+
}
70+
}
71+

com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphDefaultResources.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

com.unity.render-pipelines.core/Runtime/Textures/RTHandleSystem.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,15 @@ public void Dispose()
9696
/// <param name="scaledRTMSAASamples">Number of MSAA samples for automatically scaled RTHandles.</param>
9797
public void Initialize(int width, int height, bool scaledRTsupportsMSAA, MSAASamples scaledRTMSAASamples)
9898
{
99-
Debug.Assert(m_AutoSizedRTs.Count == 0, "RTHandle.Initialize should only be called once before allocating any Render Texture. This may be caused by an unreleased RTHandle resource.");
99+
if (m_AutoSizedRTs.Count != 0)
100+
{
101+
string leakingResources = "Unreleased RTHandles:";
102+
foreach (var rt in m_AutoSizedRTs)
103+
{
104+
leakingResources = string.Format("{0}\n {1}", leakingResources, rt.name);
105+
}
106+
Debug.LogError(string.Format("RTHandle.Initialize should only be called once before allocating any Render Texture. This may be caused by an unreleased RTHandle resource.\n{0}\n", leakingResources));
107+
}
100108

101109
m_MaxWidths = width;
102110
m_MaxHeights = height;

com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,8 @@ void RegisterRenderingDebug()
14361436
widgetList.Add(new DebugUI.BoolField { displayName = "XR single-pass test mode", getter = () => data.xrSinglePassTestMode, setter = value => data.xrSinglePassTestMode = value });
14371437
}
14381438

1439+
//widgetList.Add(new DebugUI.BoolField { displayName = "Enable Render Graph", getter = () => HDRenderPipeline.currentPipeline.IsRenderGraphEnabled(), setter = value => HDRenderPipeline.currentPipeline.EnableRenderGraph(value) });
1440+
14391441
m_DebugRenderingItems = widgetList.ToArray();
14401442
var panel = DebugManager.instance.GetPanel(k_PanelRendering, true);
14411443
panel.children.Add(m_DebugRenderingItems);

com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ public void InitData(RenderPipelineResources renderPipelineResources)
5555

5656
m_Blit = CoreUtils.CreateEngineMaterial(renderPipelineResources.shaders.blitPS);
5757

58+
InitializeNonRenderGraphResources();
59+
}
60+
61+
public void ReleaseData()
62+
{
63+
CoreUtils.Destroy(m_Blit);
64+
CoreUtils.Destroy(m_DebugLightVolumeMaterial);
65+
66+
CleanupNonRenderGraphResources();
67+
}
68+
69+
public void InitializeNonRenderGraphResources()
70+
{
5871
m_LightCountBuffer = RTHandles.Alloc(Vector2.one, TextureXR.slices, dimension: TextureXR.dimension, colorFormat: GraphicsFormat.R32_SFloat, enableRandomWrite: false, useMipMap: false, name: "LightVolumeCount");
5972
m_ColorAccumulationBuffer = RTHandles.Alloc(Vector2.one, TextureXR.slices, dimension: TextureXR.dimension, colorFormat: GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite: false, useMipMap: false, name: "LightVolumeColorAccumulation");
6073
m_DebugLightVolumesTexture = RTHandles.Alloc(Vector2.one, TextureXR.slices, dimension: TextureXR.dimension, colorFormat: GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite: true, useMipMap: false, name: "LightVolumeDebugLightVolumesTexture");
@@ -64,16 +77,12 @@ public void InitData(RenderPipelineResources renderPipelineResources)
6477
m_RTIDs[1] = m_ColorAccumulationBuffer;
6578
}
6679

67-
public void ReleaseData()
80+
public void CleanupNonRenderGraphResources()
6881
{
69-
CoreUtils.Destroy(m_Blit);
70-
7182
RTHandles.Release(m_DepthBuffer);
7283
RTHandles.Release(m_DebugLightVolumesTexture);
7384
RTHandles.Release(m_ColorAccumulationBuffer);
7485
RTHandles.Release(m_LightCountBuffer);
75-
76-
CoreUtils.Destroy(m_DebugLightVolumeMaterial);
7786
}
7887

7988
public struct RenderLightVolumesParameters

com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ float GetPunctualShadowClosestDistance(HDShadowContext shadowContext, SamplerSta
5757
// Note: Here we assume that all the shadow map cube faces have been added contiguously in the buffer to retreive the shadow information
5858
// TODO: if on the light type to retrieve the good shadow data
5959
HDShadowData sd = shadowContext.shadowDatas[shadowDataIndex];
60-
60+
6161
if (pointLight)
6262
{
6363
sd.shadowToWorld = shadowContext.shadowDatas[shadowDataIndex + CubeMapFaceID(-L)].shadowToWorld;
@@ -66,14 +66,14 @@ float GetPunctualShadowClosestDistance(HDShadowContext shadowContext, SamplerSta
6666
sd.rot1 = shadowContext.shadowDatas[shadowDataIndex + CubeMapFaceID(-L)].rot1;
6767
sd.rot2 = shadowContext.shadowDatas[shadowDataIndex + CubeMapFaceID(-L)].rot2;
6868
}
69-
69+
7070
return EvalShadow_SampleClosestDistance_Punctual(sd, _ShadowmapAtlas, sampl, positionWS, L, lightPositionWS);
7171
}
7272

7373
float GetAreaLightAttenuation(HDShadowContext shadowContext, float2 positionSS, float3 positionWS, float3 normalWS, int shadowDataIndex, float3 L, float L_dist)
7474
{
7575
HDShadowData sd = shadowContext.shadowDatas[shadowDataIndex];
76-
return EvalShadow_AreaDepth(sd, _AreaShadowmapMomentAtlas, positionSS, positionWS, normalWS, L, L_dist, true);
76+
return EvalShadow_AreaDepth(sd, _ShadowmapAreaAtlas, positionSS, positionWS, normalWS, L, L_dist, true);
7777
}
7878

7979

com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2717,6 +2717,7 @@ bool PrepareLightsForGPU(CommandBuffer cmd, HDCamera hdCamera, CullingResults cu
27172717
}
27182718

27192719
PushLightDataGlobalParams(cmd);
2720+
PushShadowGlobalParams(cmd);
27202721
}
27212722

27222723
m_EnableBakeShadowMask = m_EnableBakeShadowMask && hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask);
@@ -3402,20 +3403,6 @@ HDAdditionalLightData GetHDAdditionalLightData(Light light)
34023403
return add;
34033404
}
34043405

3405-
struct ShadowGlobalParameters
3406-
{
3407-
public HDCamera hdCamera;
3408-
public HDShadowManager shadowManager;
3409-
}
3410-
3411-
ShadowGlobalParameters PrepareShadowGlobalParameters(HDCamera hdCamera)
3412-
{
3413-
ShadowGlobalParameters parameters = new ShadowGlobalParameters();
3414-
parameters.hdCamera = hdCamera;
3415-
parameters.shadowManager = m_ShadowManager;
3416-
return parameters;
3417-
}
3418-
34193406
struct LightLoopGlobalParameters
34203407
{
34213408
public HDCamera hdCamera;
@@ -3510,16 +3497,9 @@ void PushLightDataGlobalParams(CommandBuffer cmd)
35103497
cmd.SetGlobalBuffer(HDShaderIDs._DirectionalLightDatas, m_LightLoopLightData.directionalLightData);
35113498
}
35123499

3513-
static void PushShadowGlobalParams(in ShadowGlobalParameters param, CommandBuffer cmd)
3500+
void PushShadowGlobalParams(CommandBuffer cmd)
35143501
{
3515-
using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.PushShadowGlobalParameters)))
3516-
{
3517-
Camera camera = param.hdCamera.camera;
3518-
3519-
// Shadows
3520-
param.shadowManager.SyncData();
3521-
param.shadowManager.BindResources(cmd);
3522-
}
3502+
m_ShadowManager.PushGlobalParameters(cmd);
35233503
}
35243504

35253505
static void PushLightLoopGlobalParams(in LightLoopGlobalParameters param, CommandBuffer cmd)
@@ -3550,8 +3530,7 @@ void RenderShadowMaps(ScriptableRenderContext renderContext, CommandBuffer cmd,
35503530
m_ShadowManager.RenderShadows(renderContext, cmd, globalCB, cullResults, hdCamera);
35513531

35523532
// Bind the shadow data
3553-
var globalParams = PrepareShadowGlobalParameters(hdCamera);
3554-
PushShadowGlobalParams(globalParams, cmd);
3533+
m_ShadowManager.BindResources(cmd);
35553534
}
35563535

35573536
bool WillRenderContactShadow()

com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@ internal void Cleanup()
234234
ReleaseRT();
235235
}
236236

237+
internal void InitializeNonRenderGraphResources()
238+
{
239+
float scaleFactor = m_RunningFullRes ? 1.0f : 0.5f;
240+
AllocRT(scaleFactor);
241+
}
242+
243+
internal void CleanupNonRenderGraphResources()
244+
{
245+
ReleaseRT();
246+
}
247+
237248
internal void InitRaytracing(HDRenderPipeline renderPipeline)
238249
{
239250
m_RaytracingAmbientOcclusion.Init(renderPipeline);

0 commit comments

Comments
 (0)