From d66c7acaabf8e58e81f42a291cbe8e6550d6d6ac Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Fri, 27 Mar 2020 10:48:46 +0100 Subject: [PATCH 01/12] Added import and usage of Compute Buffer API to render graph. --- .../Runtime/RenderGraph/RenderGraph.cs | 62 +++++++++++-------- .../Runtime/RenderGraph/RenderGraphBuilder.cs | 26 +++++++- .../RenderGraphResourceRegistry.cs | 54 +++++++++++++++- 3 files changed, 114 insertions(+), 28 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index 57421b3576e..07d4911c9c6 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -103,28 +103,30 @@ internal RenderFunc GetExecuteDelegate() internal abstract void Release(RenderGraphContext renderGraphContext); internal abstract bool HasRenderFunc(); - internal string name; - internal int index; - internal ProfilingSampler customSampler; - internal List resourceReadList = new List(); - internal List resourceWriteList = new List(); - internal List usedRendererListList = new List(); - internal bool enableAsyncCompute; - internal TextureHandle depthBuffer { get { return m_DepthBuffer; } } - internal TextureHandle[] colorBuffers { get { return m_ColorBuffers; } } - internal int colorBufferMaxIndex { get { return m_MaxColorBufferIndex; } } - - protected TextureHandle[] m_ColorBuffers = new TextureHandle[kMaxMRTCount]; - protected TextureHandle m_DepthBuffer; - protected int m_MaxColorBufferIndex = -1; + internal string name; + internal int index; + internal ProfilingSampler customSampler; + internal List textureReadList = new List(); + internal List textureWriteList = new List(); + internal List bufferReadList = new List(); + internal List bufferWriteList = new List(); + internal List usedRendererListList = new List(); + internal bool enableAsyncCompute; + internal TextureHandle depthBuffer { get { return m_DepthBuffer; } } + internal TextureHandle[] colorBuffers { get { return m_ColorBuffers; } } + internal int colorBufferMaxIndex { get { return m_MaxColorBufferIndex; } } + + protected TextureHandle[] m_ColorBuffers = new TextureHandle[kMaxMRTCount]; + protected TextureHandle m_DepthBuffer; + protected int m_MaxColorBufferIndex = -1; internal void Clear() { name = ""; index = -1; customSampler = null; - resourceReadList.Clear(); - resourceWriteList.Clear(); + textureReadList.Clear(); + textureWriteList.Clear(); usedRendererListList.Clear(); enableAsyncCompute = false; @@ -142,16 +144,16 @@ internal void SetColorBuffer(TextureHandle resource, int index) Debug.Assert(index < RenderGraph.kMaxMRTCount && index >= 0); m_MaxColorBufferIndex = Math.Max(m_MaxColorBufferIndex, index); m_ColorBuffers[index] = resource; - resourceWriteList.Add(resource); + textureWriteList.Add(resource); } internal void SetDepthBuffer(TextureHandle resource, DepthAccess flags) { m_DepthBuffer = resource; if ((flags | DepthAccess.Read) != 0) - resourceReadList.Add(resource); + textureReadList.Add(resource); if ((flags | DepthAccess.Write) != 0) - resourceWriteList.Add(resource); + textureWriteList.Add(resource); } } @@ -225,7 +227,7 @@ public void Cleanup() /// public void RegisterDebug() { - //m_DebugParameters.RegisterDebug(); + m_DebugParameters.RegisterDebug(); } /// @@ -233,7 +235,7 @@ public void RegisterDebug() /// public void UnRegisterDebug() { - //m_DebugParameters.UnRegisterDebug(); + m_DebugParameters.UnRegisterDebug(); } /// @@ -304,6 +306,16 @@ public RendererListHandle CreateRendererList(in RendererListDesc desc) return m_Resources.CreateRendererList(desc); } + /// + /// Import an external Compute Buffer to the Render Graph + /// + /// External Compute Buffer that needs to be imported. + /// A new ComputeBufferHandle. + public ComputeBufferHandle ImportComputeBuffer(ComputeBuffer computeBuffer) + { + return m_Resources.ImportComputeBuffer(computeBuffer); + } + /// /// Add a new Render Pass to the current Render Graph. /// @@ -460,18 +472,18 @@ void PreRenderPassSetRenderTargets(in RenderPass pass, RenderGraphContext rgCont void PreRenderPassExecute(int passIndex, in RenderPass pass, RenderGraphContext rgContext) { // TODO merge clear and setup here if possible - m_Resources.CreateAndClearTexturesForPass(rgContext, pass.index, pass.resourceWriteList); + m_Resources.CreateAndClearTexturesForPass(rgContext, pass.index, pass.textureWriteList); PreRenderPassSetRenderTargets(pass, rgContext); - m_Resources.PreRenderPassSetGlobalTextures(rgContext, pass.resourceReadList); + m_Resources.PreRenderPassSetGlobalTextures(rgContext, pass.textureReadList); } void PostRenderPassExecute(int passIndex, in RenderPass pass, RenderGraphContext rgContext) { if (m_DebugParameters.unbindGlobalTextures) - m_Resources.PostRenderPassUnbindGlobalTextures(rgContext, pass.resourceReadList); + m_Resources.PostRenderPassUnbindGlobalTextures(rgContext, pass.textureReadList); m_RenderGraphPool.ReleaseAllTempAlloc(); - m_Resources.ReleaseTexturesForPass(rgContext, pass.index, pass.resourceReadList, pass.resourceWriteList); + m_Resources.ReleaseTexturesForPass(rgContext, pass.index, pass.textureReadList, pass.textureWriteList); pass.Release(rgContext); } diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilder.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilder.cs index 10997c6531a..b100ba50abc 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilder.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilder.cs @@ -50,7 +50,7 @@ public TextureHandle UseDepthBuffer(TextureHandle input, DepthAccess flags) /// An updated resource handle to the input resource. public TextureHandle ReadTexture(TextureHandle input) { - m_RenderPass.resourceReadList.Add(input); + m_RenderPass.textureReadList.Add(input); m_Resources.UpdateTextureLastRead(input, m_RenderPass.index); return input; } @@ -63,7 +63,7 @@ public TextureHandle ReadTexture(TextureHandle input) public TextureHandle WriteTexture(TextureHandle input) { // TODO: Manage resource "version" for debugging purpose - m_RenderPass.resourceWriteList.Add(input); + m_RenderPass.textureWriteList.Add(input); m_Resources.UpdateTextureFirstWrite(input, m_RenderPass.index); return input; } @@ -79,6 +79,28 @@ public RendererListHandle UseRendererList(RendererListHandle input) return input; } + /// + /// Specify a Compute Buffer resource to read from during the pass. + /// + /// The Compute Buffer resource to read from during the pass. + /// An updated resource handle to the input resource. + public ComputeBufferHandle ReadComputeBuffer(ComputeBufferHandle input) + { + m_RenderPass.bufferReadList.Add(input); + return input; + } + + /// + /// Specify a Compute Buffer resource to write to during the pass. + /// + /// The Compute Buffer resource to write to during the pass. + /// An updated resource handle to the input resource. + public ComputeBufferHandle WriteComputeBuffer(ComputeBufferHandle input) + { + m_RenderPass.bufferWriteList.Add(input); + return input; + } + /// /// Specify the render function to use for this pass. /// A call to this is mandatory for the pass to be valid. diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs index 0f37805eed2..995d61c0dc9 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs @@ -54,6 +54,28 @@ public struct RendererListHandle public bool IsValid() => m_IsValid; } + /// + /// Compute Buffer resource handle. + /// + [DebuggerDisplay("ComputeBuffer ({handle})")] + public struct ComputeBufferHandle + { + bool m_IsValid; + internal int handle { get; private set; } + internal ComputeBufferHandle(int handle) { this.handle = handle; m_IsValid = true; } + /// + /// Conversion to int. + /// + /// Compute Buffer handle to convert. + /// The integer representation of the handle. + public static implicit operator int(ComputeBufferHandle handle) { return handle.handle; } + /// + /// Return true if the handle is valid. + /// + /// True if the handle is valid. + public bool IsValid() => m_IsValid; + } + /// /// The mode that determines the size of a Texture. /// @@ -316,11 +338,22 @@ internal RendererListResource(in RendererListDesc desc) this.rendererList = new RendererList(); // Invalid by default } } + + internal struct ComputeBufferResource + { + public ComputeBuffer computeBuffer; + + internal ComputeBufferResource(ComputeBuffer computeBuffer) + { + this.computeBuffer = computeBuffer; + } + } #endregion DynamicArray m_TextureResources = new DynamicArray(); Dictionary> m_TexturePool = new Dictionary>(); DynamicArray m_RendererListResources = new DynamicArray(); + DynamicArray m_ComputeBufferResources = new DynamicArray(); RTHandleSystem m_RTHandleSystem = new RTHandleSystem(); RenderGraphDebugParams m_RenderGraphDebug; RenderGraphLogger m_Logger; @@ -358,7 +391,7 @@ public RTHandle GetTexture(in TextureHandle handle) /// Returns the RendererList associated with the provided resource handle. /// /// Handle to a Renderer List resource. - /// The Renderer List associated with the provided resource handle or a null renderer list if the handle is invalid. + /// The Renderer List associated with the provided resource handle or an invalid renderer list if the handle is invalid. public RendererList GetRendererList(in RendererListHandle handle) { if (!handle.IsValid()) @@ -366,6 +399,19 @@ public RendererList GetRendererList(in RendererListHandle handle) return m_RendererListResources[handle].rendererList; } + + /// + /// Returns the Compute Buffer associated with the provided resource handle. + /// + /// Handle to a Compute Buffer resource. + /// The Compute Buffer associated with the provided resource handle or a null reference if the handle is invalid. + public ComputeBuffer GetComputeBuffer(in ComputeBufferHandle handle) + { + if (!handle.IsValid()) + return null; + + return m_ComputeBufferResources[handle].computeBuffer; + } #endregion #region Internal Interface @@ -456,6 +502,12 @@ internal RendererListHandle CreateRendererList(in RendererListDesc desc) return new RendererListHandle(newHandle); } + internal ComputeBufferHandle ImportComputeBuffer(ComputeBuffer computeBuffer) + { + int newHandle = m_ComputeBufferResources.Add(new ComputeBufferResource(computeBuffer)); + return new ComputeBufferHandle(newHandle); + } + internal void CreateAndClearTexturesForPass(RenderGraphContext rgContext, int passIndex, List textures) { foreach (var rgResource in textures) From ca8037619abc8f57b84d286438a651720f80a141 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Fri, 27 Mar 2020 16:36:04 +0100 Subject: [PATCH 02/12] Missing clear of Compute buffer write/read lists. --- .../Runtime/RenderGraph/RenderGraph.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index 07d4911c9c6..7fb54a6e179 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -127,6 +127,8 @@ internal void Clear() customSampler = null; textureReadList.Clear(); textureWriteList.Clear(); + bufferReadList.Clear(); + bufferWriteList.Clear(); usedRendererListList.Clear(); enableAsyncCompute = false; From c33711ae0474ec6f2620162937bbe6a70ef1448a Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Fri, 27 Mar 2020 16:38:45 +0100 Subject: [PATCH 03/12] Another missing clear. --- .../Runtime/RenderGraph/RenderGraphResourceRegistry.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs index 995d61c0dc9..51c76b3bedc 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs @@ -756,6 +756,7 @@ internal void Clear() m_TextureResources.Clear(); m_RendererListResources.Clear(); + m_ComputeBufferResources.Clear(); #if DEVELOPMENT_BUILD || UNITY_EDITOR if (m_AllocatedTextures.Count != 0) From 35e65dac6916c798cbb1b2dd6b62085d8e3b7d94 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 30 Mar 2020 09:50:32 +0200 Subject: [PATCH 04/12] Light loop compute buffers WIP # Conflicts: # com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs # com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs --- .../Runtime/Lighting/LightLoop/LightLoop.cs | 150 ++++++++++-------- .../HDRenderPipeline.LightLoop.cs | 99 +++++++++--- .../HDRenderPipeline.RenderGraph.cs | 2 +- 3 files changed, 163 insertions(+), 88 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs index 8a0bc5fa808..ed1056e3fd3 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs @@ -379,9 +379,6 @@ public void Cleanup() class TileAndClusterData { - public ComputeBuffer lightVolumeDataBuffer; - public ComputeBuffer convexBoundsBuffer; - public ComputeBuffer AABBBoundsBuffer; public ComputeBuffer probeVolumesLightVolumeDataBuffer; public ComputeBuffer probeVolumesConvexBoundsBuffer; public ComputeBuffer probeVolumesAABBBoundsBuffer; @@ -389,16 +386,24 @@ class TileAndClusterData public ComputeBuffer probeVolumesPerVoxelLightLists; public ComputeBuffer probeVolumesPerVoxelOffset; public ComputeBuffer probeVolumesGlobalLightListAtomic; - public ComputeBuffer lightList; - public ComputeBuffer tileList; - public ComputeBuffer tileFeatureFlags; - public ComputeBuffer dispatchIndirectBuffer; - public ComputeBuffer bigTileLightList; // used for pre-pass coarse culling on 64x64 tiles - public ComputeBuffer perVoxelLightLists; - public ComputeBuffer perVoxelOffset; - public ComputeBuffer perTileLogBaseTweak; + + // Internal to light list building + public ComputeBuffer lightVolumeDataBuffer; + public ComputeBuffer convexBoundsBuffer; + public ComputeBuffer AABBBoundsBuffer; public ComputeBuffer globalLightListAtomic; + // Output + public ComputeBuffer tileFeatureFlags; // Deferred + public ComputeBuffer dispatchIndirectBuffer; // Deferred + public ComputeBuffer perVoxelOffset; // Cluster + public ComputeBuffer perTileLogBaseTweak; // Cluster + public ComputeBuffer tileList; // Deferred + // used for pre-pass coarse culling on 64x64 tiles + public ComputeBuffer bigTileLightList; // Volumetric + public ComputeBuffer perVoxelLightLists; // Cluster + public ComputeBuffer lightList; // ContactShadows, Deferred, Forward w/ fptl + public bool listsAreClear = false; public bool probeVolumesListsAreClear = false; @@ -2889,21 +2894,49 @@ struct BuildGPULightListParameters struct BuildGPULightListResources { - public TileAndClusterData tileAndClusterData; public RTHandle depthBuffer; public RTHandle stencilTexture; public RTHandle[] gBuffer; + + // Internal to light list building + public ComputeBuffer lightVolumeDataBuffer; + public ComputeBuffer convexBoundsBuffer; + public ComputeBuffer AABBBoundsBuffer; + public ComputeBuffer globalLightListAtomic; + + // Output + public ComputeBuffer tileFeatureFlags; // Deferred + public ComputeBuffer dispatchIndirectBuffer; // Deferred + public ComputeBuffer perVoxelOffset; // Cluster + public ComputeBuffer perTileLogBaseTweak; // Cluster + public ComputeBuffer tileList; // Deferred + // used for pre-pass coarse culling on 64x64 tiles + public ComputeBuffer bigTileLightList; // Volumetrics + public ComputeBuffer perVoxelLightLists; // Cluster + public ComputeBuffer lightList; // ContactShadows, Deferred, Forward w/ fptl } BuildGPULightListResources PrepareBuildGPULightListResources(TileAndClusterData tileAndClusterData, RTHandle depthBuffer, RTHandle stencilTexture, bool isGBufferNeeded) { var resources = new BuildGPULightListResources(); - resources.tileAndClusterData = tileAndClusterData; resources.depthBuffer = depthBuffer; resources.stencilTexture = stencilTexture; resources.gBuffer = isGBufferNeeded ? m_GbufferManager.GetBuffers() : null; + resources.bigTileLightList = tileAndClusterData.bigTileLightList; + resources.lightList = tileAndClusterData.lightList; + resources.perVoxelOffset = tileAndClusterData.perVoxelOffset; + resources.convexBoundsBuffer = tileAndClusterData.convexBoundsBuffer; + resources.AABBBoundsBuffer = tileAndClusterData.AABBBoundsBuffer; + resources.lightVolumeDataBuffer = tileAndClusterData.lightVolumeDataBuffer; + resources.tileFeatureFlags = tileAndClusterData.tileFeatureFlags; + resources.globalLightListAtomic = tileAndClusterData.globalLightListAtomic; + resources.perVoxelLightLists = tileAndClusterData.perVoxelLightLists; + resources.perTileLogBaseTweak = tileAndClusterData.perTileLogBaseTweak; + resources.dispatchIndirectBuffer = tileAndClusterData.dispatchIndirectBuffer; + resources.tileList = tileAndClusterData.tileList; + return resources; } @@ -2923,22 +2956,15 @@ static void ClearLightLists( in BuildGPULightListParameters parameters, // ClearLightLists is the first pass, we push the global parameters for light list building here. ConstantBuffer.PushGlobal(cmd, parameters.lightListCB, HDShaderIDs._ShaderVariablesLightList); - if (parameters.clearLightLists && !parameters.runLightList) + if (parameters.clearLightLists) { // Note we clear the whole content and not just the header since it is fast enough, happens only in one frame and is a bit more robust // to changes to the inner workings of the lists. // Also, we clear all the lists and to be resilient to changes in pipeline. - if (parameters.runBigTilePrepass) - ClearLightList(parameters, cmd, resources.tileAndClusterData.bigTileLightList); - ClearLightList(parameters, cmd, resources.tileAndClusterData.lightList); - ClearLightList(parameters, cmd, resources.tileAndClusterData.perVoxelOffset); - - // No need to clear it anymore until we start and stop running light list building. - resources.tileAndClusterData.listsAreClear = true; - } - else if (parameters.runLightList) - { - resources.tileAndClusterData.listsAreClear = false; + if (parameters.runBigTilePrepass) + ClearLightList(parameters, cmd, resources.bigTileLightList); + ClearLightList(parameters, cmd, resources.lightList); + ClearLightList(parameters, cmd, resources.perVoxelOffset); } } @@ -2947,11 +2973,9 @@ static void GenerateLightsScreenSpaceAABBs(in BuildGPULightListParameters parame { if (parameters.totalLightCount != 0) { - var tileAndCluster = resources.tileAndClusterData; - // With XR single-pass, we have one set of light bounds per view to iterate over (bounds are in view space for each view) - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, tileAndCluster.convexBoundsBuffer); - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.AABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, resources.convexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, resources.AABBBoundsBuffer); cmd.DispatchCompute(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, (parameters.totalLightCount + 7) / 8, parameters.viewCount, 1); } } @@ -2961,12 +2985,10 @@ static void BigTilePrepass(in BuildGPULightListParameters parameters, in BuildGP { if (parameters.runLightList && parameters.runBigTilePrepass) { - var tileAndCluster = resources.tileAndClusterData; - - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vLightList, tileAndCluster.bigTileLightList); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.AABBBoundsBuffer); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs._LightVolumeData, tileAndCluster.lightVolumeDataBuffer); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_data, tileAndCluster.convexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vLightList, resources.bigTileLightList); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vBoundsBuffer, resources.AABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs._LightVolumeData, resources.lightVolumeDataBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_data, resources.convexBoundsBuffer); cmd.DispatchCompute(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, parameters.numBigTilesX, parameters.numBigTilesY, parameters.viewCount); } @@ -2977,16 +2999,14 @@ static void BuildPerTileLightList(in BuildGPULightListParameters parameters, in // optimized for opaques only if (parameters.runLightList && parameters.runFPTL) { - var tileAndCluster = resources.tileAndClusterData; - - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.AABBBoundsBuffer); - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs._LightVolumeData, tileAndCluster.lightVolumeDataBuffer); - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_data, tileAndCluster.convexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vBoundsBuffer, resources.AABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs._LightVolumeData, resources.lightVolumeDataBuffer); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_data, resources.convexBoundsBuffer); cmd.SetComputeTextureParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_depth_tex, resources.depthBuffer); - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vLightList, tileAndCluster.lightList); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vLightList, resources.lightList); if (parameters.runBigTilePrepass) - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vBigTileLightList, tileAndCluster.bigTileLightList); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_vBigTileLightList, resources.bigTileLightList); if (parameters.enableFeatureVariants) { @@ -3014,7 +3034,7 @@ static void BuildPerTileLightList(in BuildGPULightListParameters parameters, in localLightListCB.g_BaseFeatureFlags = baseFeatureFlags; ConstantBuffer.PushGlobal(cmd, localLightListCB, HDShaderIDs._ShaderVariablesLightList); - cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_TileFeatureFlags, tileAndCluster.tileFeatureFlags); + cmd.SetComputeBufferParam(parameters.buildPerTileLightListShader, parameters.buildPerTileLightListKernel, HDShaderIDs.g_TileFeatureFlags, resources.tileFeatureFlags); tileFlagsWritten = true; } @@ -3025,28 +3045,26 @@ static void VoxelLightListGeneration(in BuildGPULightListParameters parameters, { if (parameters.runLightList) { - var tileAndCluster = resources.tileAndClusterData; - // clear atomic offset index - cmd.SetComputeBufferParam(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.globalLightListAtomic); + cmd.SetComputeBufferParam(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.globalLightListAtomic); cmd.DispatchCompute(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, 1, 1, 1); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.globalLightListAtomic); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.globalLightListAtomic); cmd.SetComputeTextureParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_depth_tex, resources.depthBuffer); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vLayeredLightList, tileAndCluster.perVoxelLightLists); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_LayeredOffset, tileAndCluster.perVoxelOffset); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.globalLightListAtomic); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vLayeredLightList, resources.perVoxelLightLists); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_LayeredOffset, resources.perVoxelOffset); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.globalLightListAtomic); if (parameters.runBigTilePrepass) - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vBigTileLightList, tileAndCluster.bigTileLightList); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vBigTileLightList, resources.bigTileLightList); if (k_UseDepthBuffer) { - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_logBaseBuffer, tileAndCluster.perTileLogBaseTweak); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_logBaseBuffer, resources.perTileLogBaseTweak); } - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.AABBBoundsBuffer); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs._LightVolumeData, tileAndCluster.lightVolumeDataBuffer); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_data, tileAndCluster.convexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vBoundsBuffer, resources.AABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs._LightVolumeData, resources.lightVolumeDataBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_data, resources.convexBoundsBuffer); cmd.DispatchCompute(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, parameters.numTilesClusterX, parameters.numTilesClusterY, parameters.viewCount); } @@ -3056,8 +3074,6 @@ static void BuildDispatchIndirectArguments(in BuildGPULightListParameters parame { if (parameters.enableFeatureVariants) { - var tileAndCluster = resources.tileAndClusterData; - // We need to touch up the tile flags if we need material classification or, if disabled, to patch up for missing flags during the skipped light tile gen bool needModifyingTileFeatures = !tileFlagsWritten || parameters.computeMaterialVariants; if (needModifyingTileFeatures) @@ -3101,7 +3117,7 @@ static void BuildDispatchIndirectArguments(in BuildGPULightListParameters parame localLightListCB.g_BaseFeatureFlags = baseFeatureFlags; ConstantBuffer.PushGlobal(cmd, localLightListCB, HDShaderIDs._ShaderVariablesLightList); - cmd.SetComputeBufferParam(parameters.buildMaterialFlagsShader, buildMaterialFlagsKernel, HDShaderIDs.g_TileFeatureFlags, tileAndCluster.tileFeatureFlags); + cmd.SetComputeBufferParam(parameters.buildMaterialFlagsShader, buildMaterialFlagsKernel, HDShaderIDs.g_TileFeatureFlags, resources.tileFeatureFlags); for (int i = 0; i < resources.gBuffer.Length; ++i) cmd.SetComputeTextureParam(parameters.buildMaterialFlagsShader, buildMaterialFlagsKernel, HDShaderIDs._GBufferTexture[i], resources.gBuffer[i]); @@ -3121,7 +3137,7 @@ static void BuildDispatchIndirectArguments(in BuildGPULightListParameters parame // clear dispatch indirect buffer if (parameters.useComputeAsPixel) { - cmd.SetComputeBufferParam(parameters.clearDispatchIndirectShader, s_ClearDrawProceduralIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, tileAndCluster.dispatchIndirectBuffer); + cmd.SetComputeBufferParam(parameters.clearDispatchIndirectShader, s_ClearDrawProceduralIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, resources.dispatchIndirectBuffer); cmd.SetComputeIntParam(parameters.clearDispatchIndirectShader, HDShaderIDs.g_NumTiles, parameters.numTilesFPTL); cmd.SetComputeIntParam(parameters.clearDispatchIndirectShader, HDShaderIDs.g_VertexPerTile, k_HasNativeQuadSupport ? 4 : 6); cmd.DispatchCompute(parameters.clearDispatchIndirectShader, s_ClearDrawProceduralIndirectKernel, 1, 1, 1); @@ -3129,14 +3145,14 @@ static void BuildDispatchIndirectArguments(in BuildGPULightListParameters parame } else { - cmd.SetComputeBufferParam(parameters.clearDispatchIndirectShader, s_ClearDispatchIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, tileAndCluster.dispatchIndirectBuffer); + cmd.SetComputeBufferParam(parameters.clearDispatchIndirectShader, s_ClearDispatchIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, resources.dispatchIndirectBuffer); cmd.DispatchCompute(parameters.clearDispatchIndirectShader, s_ClearDispatchIndirectKernel, 1, 1, 1); } // add tiles to indirect buffer - cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, tileAndCluster.dispatchIndirectBuffer); - cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_TileList, tileAndCluster.tileList); - cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_TileFeatureFlags, tileAndCluster.tileFeatureFlags); + cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_DispatchIndirectBuffer, resources.dispatchIndirectBuffer); + cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_TileList, resources.tileList); + cmd.SetComputeBufferParam(parameters.buildDispatchIndirectShader, s_BuildIndirectKernel, HDShaderIDs.g_TileFeatureFlags, resources.tileFeatureFlags); cmd.SetComputeIntParam(parameters.buildDispatchIndirectShader, HDShaderIDs.g_NumTiles, parameters.numTilesFPTL); cmd.SetComputeIntParam(parameters.buildDispatchIndirectShader, HDShaderIDs.g_NumTilesX, parameters.numTilesFPTLX); // Round on k_ThreadGroupOptimalSize so we have optimal thread for buildDispatchIndirectShader kernel @@ -3230,6 +3246,12 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h else if (!parameters.runLightList && !m_TileAndClusterData.listsAreClear) { parameters.clearLightLists = true; + // No need to clear it anymore until we start and stop running light list building. + m_TileAndClusterData.listsAreClear = true; + } + else if (parameters.runLightList) + { + m_TileAndClusterData.listsAreClear = false; } if (hdCamera.xr.enabled) @@ -3650,8 +3672,6 @@ static void PushLightLoopGlobalParams(in LightLoopGlobalParameters param, Comman { using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.PushGlobalParameters))) { - Camera camera = param.hdCamera.camera; - if (param.hdCamera.frameSettings.IsEnabled(FrameSettingsField.BigTilePrepass)) cmd.SetGlobalBuffer(HDShaderIDs.g_vBigTileLightList, param.tileAndClusterData.bigTileLightList); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs index af2f4eff735..ca6306913b7 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs @@ -27,18 +27,67 @@ static void ReadLightingBuffers(LightingBuffers buffers, RenderGraphBuilder buil class BuildGPULightListPassData { - public ShadowGlobalParameters shadowGlobalParameters; - public LightLoopGlobalParameters lightLoopGlobalParameters; + public ShadowGlobalParameters shadowGlobalParameters; + public LightLoopGlobalParameters lightLoopGlobalParameters; - public BuildGPULightListParameters buildGPULightListParameters; - public BuildGPULightListResources buildGPULightListResources; + public BuildGPULightListParameters buildGPULightListParameters; public TextureHandle depthBuffer; public TextureHandle stencilTexture; public TextureHandle[] gBuffer = new TextureHandle[RenderGraph.kMaxMRTCount]; - public int gBufferCount; + public int gBufferCount; + + // These buffers are not used outside of BuildGPULight list so they don't need to be known by the render graph. + public ComputeBuffer lightVolumeDataBuffer; + public ComputeBuffer convexBoundsBuffer; + public ComputeBuffer AABBBoundsBuffer; + public ComputeBuffer globalLightListAtomic; + + public BuildGPULightListOutput output = new BuildGPULightListOutput(); + } + + struct BuildGPULightListOutput + { + public ComputeBufferHandle tileFeatureFlags; + public ComputeBufferHandle dispatchIndirectBuffer; + public ComputeBufferHandle perVoxelOffset; + public ComputeBufferHandle perTileLogBaseTweak; + public ComputeBufferHandle tileList; + public ComputeBufferHandle bigTileLightList; + public ComputeBufferHandle perVoxelLightLists; + public ComputeBufferHandle lightList; } - void BuildGPULightList(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthStencilBuffer, TextureHandle stencilBufferCopy, GBufferOutput gBuffer) + static BuildGPULightListResources PrepareBuildGPULightListResources(RenderGraphContext context, BuildGPULightListPassData data) + { + var buildLightListResources = new BuildGPULightListResources(); + + buildLightListResources.depthBuffer = context.resources.GetTexture(data.depthBuffer); + buildLightListResources.stencilTexture = context.resources.GetTexture(data.stencilTexture); + if (data.buildGPULightListParameters.computeMaterialVariants && data.buildGPULightListParameters.enableFeatureVariants) + { + buildLightListResources.gBuffer = context.renderGraphPool.GetTempArray(data.gBufferCount); + for (int i = 0; i < data.gBufferCount; ++i) + buildLightListResources.gBuffer[i] = context.resources.GetTexture(data.gBuffer[i]); + } + + buildLightListResources.lightVolumeDataBuffer = data.lightVolumeDataBuffer; + buildLightListResources.convexBoundsBuffer = data.convexBoundsBuffer; + buildLightListResources.AABBBoundsBuffer = data.AABBBoundsBuffer; + buildLightListResources.globalLightListAtomic = data.globalLightListAtomic; + + buildLightListResources.tileFeatureFlags = context.resources.GetComputeBuffer(data.output.tileFeatureFlags); + buildLightListResources.dispatchIndirectBuffer = context.resources.GetComputeBuffer(data.output.dispatchIndirectBuffer); + buildLightListResources.perVoxelOffset = context.resources.GetComputeBuffer(data.output.perVoxelOffset); + buildLightListResources.perTileLogBaseTweak = context.resources.GetComputeBuffer(data.output.perTileLogBaseTweak); + buildLightListResources.tileList = context.resources.GetComputeBuffer(data.output.tileList); + buildLightListResources.bigTileLightList = context.resources.GetComputeBuffer(data.output.bigTileLightList); + buildLightListResources.perVoxelLightLists = context.resources.GetComputeBuffer(data.output.perVoxelLightLists); + buildLightListResources.lightList = context.resources.GetComputeBuffer(data.output.lightList); + + return buildLightListResources; + } + + BuildGPULightListOutput BuildGPULightList(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthStencilBuffer, TextureHandle stencilBufferCopy, GBufferOutput gBuffer) { using (var builder = renderGraph.AddRenderPass("Build Light List", out var passData, ProfilingSampler.Get(HDProfileId.BuildLightList))) { @@ -47,8 +96,6 @@ void BuildGPULightList(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle passData.shadowGlobalParameters = PrepareShadowGlobalParameters(hdCamera); passData.lightLoopGlobalParameters = PrepareLightLoopGlobalParameters(hdCamera); passData.buildGPULightListParameters = PrepareBuildGPULightListParameters(hdCamera, buildForProbeVolumes: false); - // TODO: Move this inside the render function onces compute buffers are RenderGraph ready - passData.buildGPULightListResources = PrepareBuildGPULightListResources(m_TileAndClusterData, null, null, isGBufferNeeded: true); passData.depthBuffer = builder.ReadTexture(depthStencilBuffer); passData.stencilTexture = builder.ReadTexture(stencilBufferCopy); if (passData.buildGPULightListParameters.computeMaterialVariants && passData.buildGPULightListParameters.enableFeatureVariants) @@ -58,33 +105,41 @@ void BuildGPULightList(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle passData.gBufferCount = gBuffer.gBufferCount; } + passData.lightVolumeDataBuffer = m_TileAndClusterData.lightVolumeDataBuffer; + passData.convexBoundsBuffer = m_TileAndClusterData.convexBoundsBuffer; + passData.AABBBoundsBuffer = m_TileAndClusterData.AABBBoundsBuffer; + passData.globalLightListAtomic = m_TileAndClusterData.globalLightListAtomic; + + passData.output.tileFeatureFlags = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.tileFeatureFlags)); + passData.output.dispatchIndirectBuffer = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.dispatchIndirectBuffer)); + passData.output.perVoxelOffset = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.perVoxelOffset)); + passData.output.perTileLogBaseTweak = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.perTileLogBaseTweak)); + passData.output.tileList = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.tileList)); + passData.output.bigTileLightList = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.bigTileLightList)); + passData.output.perVoxelLightLists = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.perVoxelLightLists)); + passData.output.lightList = builder.WriteComputeBuffer(renderGraph.ImportComputeBuffer(m_TileAndClusterData.lightList)); + builder.SetRenderFunc( (BuildGPULightListPassData data, RenderGraphContext context) => { bool tileFlagsWritten = false; - data.buildGPULightListResources.depthBuffer = context.resources.GetTexture(data.depthBuffer); - data.buildGPULightListResources.stencilTexture = context.resources.GetTexture(data.stencilTexture); - if (data.buildGPULightListParameters.computeMaterialVariants && data.buildGPULightListParameters.enableFeatureVariants) - { - data.buildGPULightListResources.gBuffer = context.renderGraphPool.GetTempArray(data.gBufferCount); - for (int i = 0; i < data.gBufferCount; ++i) - data.buildGPULightListResources.gBuffer[i] = context.resources.GetTexture(data.gBuffer[i]); - } + var buildLightListResources = PrepareBuildGPULightListResources(context, data); - ClearLightLists(data.buildGPULightListParameters, data.buildGPULightListResources, context.cmd); - GenerateLightsScreenSpaceAABBs(data.buildGPULightListParameters, data.buildGPULightListResources, context.cmd); - BigTilePrepass(data.buildGPULightListParameters, data.buildGPULightListResources, context.cmd); - BuildPerTileLightList(data.buildGPULightListParameters, data.buildGPULightListResources, ref tileFlagsWritten, context.cmd); - VoxelLightListGeneration(data.buildGPULightListParameters, data.buildGPULightListResources, context.cmd); + ClearLightLists(data.buildGPULightListParameters, buildLightListResources, context.cmd); + GenerateLightsScreenSpaceAABBs(data.buildGPULightListParameters, buildLightListResources, context.cmd); + BigTilePrepass(data.buildGPULightListParameters, buildLightListResources, context.cmd); + BuildPerTileLightList(data.buildGPULightListParameters, buildLightListResources, ref tileFlagsWritten, context.cmd); + VoxelLightListGeneration(data.buildGPULightListParameters, buildLightListResources, context.cmd); - BuildDispatchIndirectArguments(data.buildGPULightListParameters, data.buildGPULightListResources, tileFlagsWritten, context.cmd); + BuildDispatchIndirectArguments(data.buildGPULightListParameters, buildLightListResources, tileFlagsWritten, context.cmd); // TODO RENDERGRAPH WARNING: Note that the three sets of variables are bound here, but it should be handled differently. PushShadowGlobalParams(data.shadowGlobalParameters, context.cmd); PushLightLoopGlobalParams(data.lightLoopGlobalParameters, context.cmd); }); + return passData.output; } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index 379d8298beb..d914ec33cee 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -63,7 +63,7 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, } else { - BuildGPULightList(m_RenderGraph, hdCamera, prepassOutput.depthBuffer, prepassOutput.stencilBuffer, prepassOutput.gbuffer); + var gpuLightListOutput = BuildGPULightList(m_RenderGraph, hdCamera, prepassOutput.depthBuffer, prepassOutput.stencilBuffer, prepassOutput.gbuffer); lightingBuffers.ambientOcclusionBuffer = m_AmbientOcclusionSystem.Render(m_RenderGraph, hdCamera, prepassOutput.depthPyramidTexture, prepassOutput.motionVectorsBuffer, m_FrameCount); // Should probably be inside the AO render function but since it's a separate class it's currently not super clean to do. From 957c207d61870410cb0a829a653023600fbbab95 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 6 Apr 2020 14:03:01 +0200 Subject: [PATCH 05/12] Reverted Render Graph debug registering by default. --- .../Runtime/RenderGraph/RenderGraph.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index 7fb54a6e179..9eac2352b8b 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -229,7 +229,7 @@ public void Cleanup() /// public void RegisterDebug() { - m_DebugParameters.RegisterDebug(); + //m_DebugParameters.RegisterDebug(); } /// @@ -237,7 +237,7 @@ public void RegisterDebug() /// public void UnRegisterDebug() { - m_DebugParameters.UnRegisterDebug(); + //m_DebugParameters.UnRegisterDebug(); } /// From 0e7c0836f130b53bd055a6bed8ced3d90034d5c8 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Thu, 16 Apr 2020 14:34:48 +0200 Subject: [PATCH 06/12] Post merge fixes --- .../Runtime/Lighting/LightLoop/LightLoop.cs | 86 ++++++++++--------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs index ed1056e3fd3..888dd8bea94 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs @@ -379,19 +379,15 @@ public void Cleanup() class TileAndClusterData { - public ComputeBuffer probeVolumesLightVolumeDataBuffer; - public ComputeBuffer probeVolumesConvexBoundsBuffer; - public ComputeBuffer probeVolumesAABBBoundsBuffer; - public ComputeBuffer probeVolumesBigTileLightList; - public ComputeBuffer probeVolumesPerVoxelLightLists; - public ComputeBuffer probeVolumesPerVoxelOffset; - public ComputeBuffer probeVolumesGlobalLightListAtomic; - // Internal to light list building public ComputeBuffer lightVolumeDataBuffer; public ComputeBuffer convexBoundsBuffer; public ComputeBuffer AABBBoundsBuffer; public ComputeBuffer globalLightListAtomic; + public ComputeBuffer probeVolumesLightVolumeDataBuffer; + public ComputeBuffer probeVolumesConvexBoundsBuffer; + public ComputeBuffer probeVolumesAABBBoundsBuffer; + public ComputeBuffer probeVolumesGlobalLightListAtomic; // Output public ComputeBuffer tileFeatureFlags; // Deferred @@ -403,6 +399,9 @@ class TileAndClusterData public ComputeBuffer bigTileLightList; // Volumetric public ComputeBuffer perVoxelLightLists; // Cluster public ComputeBuffer lightList; // ContactShadows, Deferred, Forward w/ fptl + public ComputeBuffer probeVolumesBigTileLightList; + public ComputeBuffer probeVolumesPerVoxelLightLists; + public ComputeBuffer probeVolumesPerVoxelOffset; public bool listsAreClear = false; public bool probeVolumesListsAreClear = false; @@ -2903,6 +2902,10 @@ struct BuildGPULightListResources public ComputeBuffer convexBoundsBuffer; public ComputeBuffer AABBBoundsBuffer; public ComputeBuffer globalLightListAtomic; + public ComputeBuffer probeVolumesLightVolumeDataBuffer; + public ComputeBuffer probeVolumesConvexBoundsBuffer; + public ComputeBuffer probeVolumesAABBBoundsBuffer; + public ComputeBuffer probeVolumesGlobalLightListAtomic; // Output public ComputeBuffer tileFeatureFlags; // Deferred @@ -2914,6 +2917,9 @@ struct BuildGPULightListResources public ComputeBuffer bigTileLightList; // Volumetrics public ComputeBuffer perVoxelLightLists; // Cluster public ComputeBuffer lightList; // ContactShadows, Deferred, Forward w/ fptl + public ComputeBuffer probeVolumesBigTileLightList; + public ComputeBuffer probeVolumesPerVoxelLightLists; + public ComputeBuffer probeVolumesPerVoxelOffset; } BuildGPULightListResources PrepareBuildGPULightListResources(TileAndClusterData tileAndClusterData, RTHandle depthBuffer, RTHandle stencilTexture, bool isGBufferNeeded) @@ -2937,6 +2943,14 @@ BuildGPULightListResources PrepareBuildGPULightListResources(TileAndClusterData resources.dispatchIndirectBuffer = tileAndClusterData.dispatchIndirectBuffer; resources.tileList = tileAndClusterData.tileList; + resources.probeVolumesLightVolumeDataBuffer = tileAndClusterData.probeVolumesLightVolumeDataBuffer; + resources.probeVolumesConvexBoundsBuffer = tileAndClusterData.probeVolumesConvexBoundsBuffer; + resources.probeVolumesAABBBoundsBuffer = tileAndClusterData.probeVolumesAABBBoundsBuffer; + resources.probeVolumesGlobalLightListAtomic = tileAndClusterData.probeVolumesGlobalLightListAtomic; + resources.probeVolumesBigTileLightList = tileAndClusterData.probeVolumesBigTileLightList; + resources.probeVolumesPerVoxelLightLists = tileAndClusterData.probeVolumesPerVoxelLightLists; + resources.probeVolumesPerVoxelOffset = tileAndClusterData.probeVolumesPerVoxelOffset; + return resources; } @@ -3261,6 +3275,13 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h else if (!parameters.probeVolumesRunLightList && !m_TileAndClusterData.probeVolumesListsAreClear) { parameters.probeVolumesClearLightLists = true; + // No need to clear it anymore until we start and stop running light list building. + m_TileAndClusterData.probeVolumesListsAreClear = true; + + } + else if (parameters.probeVolumesRunLightList) + { + m_TileAndClusterData.listsAreClear = false; } parameters.totalLightCount = m_TotalLightCount; @@ -3376,21 +3397,14 @@ static void ClearLightListsProbeVolumes( // ClearLightLists is the first pass, we push the global parameters for light list building here. ConstantBuffer.PushGlobal(cmd, parameters.lightListCB, HDShaderIDs._ShaderVariablesLightList); - if (parameters.probeVolumesClearLightLists && !parameters.probeVolumesRunLightList) + if (parameters.probeVolumesClearLightLists) { // Note we clear the whole content and not just the header since it is fast enough, happens only in one frame and is a bit more robust // to changes to the inner workings of the lists. // Also, we clear all the lists and to be resilient to changes in pipeline. - ClearLightList(parameters, cmd, resources.tileAndClusterData.probeVolumesBigTileLightList); + ClearLightList(parameters, cmd, resources.probeVolumesBigTileLightList); // ClearLightList(hdCamera, cmd, resources.tileAndClusterData.probeVolumesLightList); - ClearLightList(parameters, cmd, resources.tileAndClusterData.probeVolumesPerVoxelOffset); - - // No need to clear it anymore until we start and stop running light list building. - resources.tileAndClusterData.probeVolumesListsAreClear = true; - } - else if(parameters.probeVolumesRunLightList) - { - resources.tileAndClusterData.probeVolumesListsAreClear = false; + ClearLightList(parameters, cmd, resources.probeVolumesPerVoxelOffset); } } @@ -3432,11 +3446,9 @@ static void GenerateProbeVolumesScreenSpaceAABBs(in BuildGPULightListParameters if (probeVolumesCount > 0) { - var tileAndCluster = resources.tileAndClusterData; - // With XR single-pass, we have one set of light bounds per view to iterate over (bounds are in view space for each view) - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, tileAndCluster.probeVolumesConvexBoundsBuffer); - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.probeVolumesAABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, resources.probeVolumesConvexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, resources.probeVolumesAABBBoundsBuffer); cmd.DispatchCompute(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, (probeVolumesCount + 7) / 8, parameters.viewCount, 1); } @@ -3451,12 +3463,10 @@ static void ProbeVolumesBigTilePrepass(in BuildGPULightListParameters parameters if (parameters.probeVolumesRunLightList && parameters.runBigTilePrepass) { - var tileAndCluster = resources.tileAndClusterData; - - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vLightList, tileAndCluster.probeVolumesBigTileLightList); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.probeVolumesAABBBoundsBuffer); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs._LightVolumeData, tileAndCluster.probeVolumesLightVolumeDataBuffer); - cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_data, tileAndCluster.probeVolumesConvexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vLightList, resources.probeVolumesBigTileLightList); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_vBoundsBuffer, resources.probeVolumesAABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs._LightVolumeData, resources.probeVolumesLightVolumeDataBuffer); + cmd.SetComputeBufferParam(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, HDShaderIDs.g_data, resources.probeVolumesConvexBoundsBuffer); cmd.DispatchCompute(parameters.bigTilePrepassShader, parameters.bigTilePrepassKernel, parameters.numBigTilesX, parameters.numBigTilesY, parameters.viewCount); } @@ -3471,29 +3481,27 @@ static void ProbeVolumesVoxelLightListGeneration(in BuildGPULightListParameters if (parameters.probeVolumesRunLightList) { - var tileAndCluster = resources.tileAndClusterData; - // clear atomic offset index - cmd.SetComputeBufferParam(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.probeVolumesGlobalLightListAtomic); + cmd.SetComputeBufferParam(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.probeVolumesGlobalLightListAtomic); cmd.DispatchCompute(parameters.clearClusterAtomicIndexShader, s_ClearVoxelAtomicKernel, 1, 1, 1); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.probeVolumesGlobalLightListAtomic); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, s_ClearVoxelAtomicKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.probeVolumesGlobalLightListAtomic); cmd.SetComputeTextureParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_depth_tex, BuiltinRenderTextureType.None); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vLayeredLightList, tileAndCluster.probeVolumesPerVoxelLightLists); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_LayeredOffset, tileAndCluster.probeVolumesPerVoxelOffset); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, tileAndCluster.probeVolumesGlobalLightListAtomic); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vLayeredLightList, resources.probeVolumesPerVoxelLightLists); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_LayeredOffset, resources.probeVolumesPerVoxelOffset); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_LayeredSingleIdxBuffer, resources.probeVolumesGlobalLightListAtomic); if (parameters.runBigTilePrepass) - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vBigTileLightList, tileAndCluster.probeVolumesBigTileLightList); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vBigTileLightList, resources.probeVolumesBigTileLightList); // if (k_UseDepthBuffer) // { // cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_logBaseBuffer, tileAndCluster.perTileLogBaseTweak); // } - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.probeVolumesAABBBoundsBuffer); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs._LightVolumeData, tileAndCluster.probeVolumesLightVolumeDataBuffer); - cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_data, tileAndCluster.probeVolumesConvexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_vBoundsBuffer, resources.probeVolumesAABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs._LightVolumeData, resources.probeVolumesLightVolumeDataBuffer); + cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, HDShaderIDs.g_data, resources.probeVolumesConvexBoundsBuffer); cmd.DispatchCompute(parameters.buildPerVoxelLightListShader, parameters.probeVolumesBuildPerVoxelLightListKernel, parameters.numTilesClusterX, parameters.numTilesClusterY, parameters.viewCount); } From 9473f16b038ab252df6b9855283cd1b6a6557f50 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Thu, 16 Apr 2020 16:25:58 +0200 Subject: [PATCH 07/12] RenderPass debugger visualization and fixed null profiling sampler --- .../Runtime/Debugging/ProfilingScope.cs | 10 ++++++++-- .../Runtime/RenderGraph/RenderGraph.cs | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs b/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs index 2d30d208abb..e0e17821416 100644 --- a/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs +++ b/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs @@ -217,7 +217,10 @@ public ProfilingScope(CommandBuffer cmd, ProfilingSampler sampler) if (cmd != null) #if UNITY_USE_RECORDER - cmd.BeginSample(m_Sampler); + if (m_Sampler != null) + cmd.BeginSample(m_Sampler); + else + cmd.BeginSample(m_Name); #else cmd.BeginSample(m_Name); #endif @@ -245,7 +248,10 @@ void Dispose(bool disposing) { if (m_Cmd != null) #if UNITY_USE_RECORDER - m_Cmd.EndSample(m_Sampler); + if (m_Sampler != null) + m_Cmd.EndSample(m_Sampler); + else + m_Cmd.EndSample(m_Name); #else m_Cmd.EndSample(m_Name); #endif diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index 9eac2352b8b..bdadc52a26a 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -94,6 +94,7 @@ public class RenderGraph ///Maximum number of MRTs supported by Render Graph. public static readonly int kMaxMRTCount = 8; + [DebuggerDisplay("RenderPass ({name})")] internal abstract class RenderPass { internal RenderFunc GetExecuteDelegate() From 9643d2206ed546be279cc1e1f08359c681cb3f93 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 20 Apr 2020 10:17:40 +0200 Subject: [PATCH 08/12] Missing using directive. --- .../Runtime/RenderGraph/RenderGraph.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index bdadc52a26a..34f7b894800 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Collections.Generic; using UnityEngine.Rendering; using UnityEngine.Profiling; From 50ca0005c442155cbb81acf2cce669d73b283ba8 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 20 Apr 2020 11:12:09 +0200 Subject: [PATCH 09/12] Post merge fix --- .../Runtime/Lighting/LightLoop/LightLoop.cs | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs index c53009eb524..14d60c55f32 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs @@ -2816,6 +2816,7 @@ struct BuildGPULightListParameters public int buildPerVoxelLightListKernel; public int numTilesClusterX; public int numTilesClusterY; + public bool clusterNeedsDepth; // Build dispatch indirect public ComputeShader buildMaterialFlagsShader; @@ -2837,10 +2838,6 @@ struct BuildGPULightListResources public ComputeBuffer convexBoundsBuffer; public ComputeBuffer AABBBoundsBuffer; public ComputeBuffer globalLightListAtomic; - public ComputeBuffer probeVolumesLightVolumeDataBuffer; - public ComputeBuffer probeVolumesConvexBoundsBuffer; - public ComputeBuffer probeVolumesAABBBoundsBuffer; - public ComputeBuffer probeVolumesGlobalLightListAtomic; // Output public ComputeBuffer tileFeatureFlags; // Deferred @@ -2852,9 +2849,6 @@ struct BuildGPULightListResources public ComputeBuffer bigTileLightList; // Volumetrics public ComputeBuffer perVoxelLightLists; // Cluster public ComputeBuffer lightList; // ContactShadows, Deferred, Forward w/ fptl - public ComputeBuffer probeVolumesBigTileLightList; - public ComputeBuffer probeVolumesPerVoxelLightLists; - public ComputeBuffer probeVolumesPerVoxelOffset; } BuildGPULightListResources PrepareBuildGPULightListResources(TileAndClusterData tileAndClusterData, RTHandle depthBuffer, RTHandle stencilTexture, bool isGBufferNeeded) @@ -2878,14 +2872,6 @@ BuildGPULightListResources PrepareBuildGPULightListResources(TileAndClusterData resources.dispatchIndirectBuffer = tileAndClusterData.dispatchIndirectBuffer; resources.tileList = tileAndClusterData.tileList; - resources.probeVolumesLightVolumeDataBuffer = tileAndClusterData.probeVolumesLightVolumeDataBuffer; - resources.probeVolumesConvexBoundsBuffer = tileAndClusterData.probeVolumesConvexBoundsBuffer; - resources.probeVolumesAABBBoundsBuffer = tileAndClusterData.probeVolumesAABBBoundsBuffer; - resources.probeVolumesGlobalLightListAtomic = tileAndClusterData.probeVolumesGlobalLightListAtomic; - resources.probeVolumesBigTileLightList = tileAndClusterData.probeVolumesBigTileLightList; - resources.probeVolumesPerVoxelLightLists = tileAndClusterData.probeVolumesPerVoxelLightLists; - resources.probeVolumesPerVoxelOffset = tileAndClusterData.probeVolumesPerVoxelOffset; - return resources; } @@ -2908,10 +2894,10 @@ static void ClearLightLists( in BuildGPULightListParameters parameters, // to changes to the inner workings of the lists. // Also, we clear all the lists and to be resilient to changes in pipeline. if (parameters.runBigTilePrepass) - ClearLightList(parameters, cmd, resources.tileAndClusterData.bigTileLightList); - if (resources.tileAndClusterData.lightList != null) // This can happen for probe volume light list build where we only generate clusters. - ClearLightList(parameters, cmd, resources.tileAndClusterData.lightList); - ClearLightList(parameters, cmd, resources.tileAndClusterData.perVoxelOffset); + ClearLightList(parameters, cmd, resources.bigTileLightList); + if (resources.lightList != null) // This can happen for probe volume light list build where we only generate clusters. + ClearLightList(parameters, cmd, resources.lightList); + ClearLightList(parameters, cmd, resources.perVoxelOffset); } } @@ -2921,8 +2907,8 @@ static void GenerateLightsScreenSpaceAABBs(in BuildGPULightListParameters parame if (parameters.totalLightCount != 0) { // With XR single-pass, we have one set of light bounds per view to iterate over (bounds are in view space for each view) - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, tileAndCluster.convexBoundsBuffer); - cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, tileAndCluster.AABBBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_data, resources.convexBoundsBuffer); + cmd.SetComputeBufferParam(parameters.screenSpaceAABBShader, parameters.screenSpaceAABBKernel, HDShaderIDs.g_vBoundsBuffer, resources.AABBBoundsBuffer); ConstantBuffer.Push(cmd, parameters.lightListCB, parameters.screenSpaceAABBShader, HDShaderIDs._ShaderVariablesLightList); @@ -3011,7 +2997,7 @@ static void VoxelLightListGeneration(in BuildGPULightListParameters parameters, if (parameters.runBigTilePrepass) cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_vBigTileLightList, resources.bigTileLightList); - if (tileAndCluster.clusterNeedsDepth) + if (parameters.clusterNeedsDepth) { cmd.SetComputeBufferParam(parameters.buildPerVoxelLightListShader, parameters.buildPerVoxelLightListKernel, HDShaderIDs.g_logBaseBuffer, resources.perTileLogBaseTweak); } @@ -3282,6 +3268,7 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h parameters.buildPerVoxelLightListKernel = isProjectionOblique ? s_ClusterObliqueKernels[(int)clustPrepassSourceIdx, (int)clustDepthSourceIdx] : s_ClusterKernels[(int)clustPrepassSourceIdx, (int)clustDepthSourceIdx]; parameters.numTilesClusterX = GetNumTileClusteredX(hdCamera); parameters.numTilesClusterY = GetNumTileClusteredY(hdCamera); + parameters.clusterNeedsDepth = tileAndClusterData.clusterNeedsDepth; // Build dispatch indirect parameters.buildMaterialFlagsShader = buildMaterialFlagsShader; From 66f53266f02e27bc562ed76550b57369f499304a Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 20 Apr 2020 12:07:06 +0200 Subject: [PATCH 10/12] Use new light list build ouptut for deferred lighting pass --- .../Runtime/Lighting/LightLoop/LightLoop.cs | 21 +++---- .../HDRenderPipeline.LightLoop.cs | 55 +++++++++++-------- .../HDRenderPipeline.RenderGraph.cs | 2 +- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs index 14d60c55f32..cc17738c189 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs @@ -379,6 +379,7 @@ public void Cleanup() class TileAndClusterData { + // Internal to light list building public ComputeBuffer lightVolumeDataBuffer { get; private set; } public ComputeBuffer convexBoundsBuffer { get; private set; } public ComputeBuffer AABBBoundsBuffer { get; private set; } @@ -3108,11 +3109,13 @@ static bool DeferredUseComputeAsPixel(FrameSettings frameSettings) return frameSettings.IsEnabled(FrameSettingsField.DeferredTile) && (!frameSettings.IsEnabled(FrameSettingsField.ComputeLightEvaluation) || k_PreferFragment); } - unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera hdCamera, bool buildForProbeVolumes) + unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters( HDCamera hdCamera, + TileAndClusterData tileAndClusterData, + ref ShaderVariablesLightList constantBuffer, + int totalLightCount) { BuildGPULightListParameters parameters = new BuildGPULightListParameters(); - var tileAndClusterData = buildForProbeVolumes ? m_ProbeVolumeClusterData : m_TileAndClusterData; var camera = hdCamera.camera; var w = (int)hdCamera.screenSize.x; @@ -3120,7 +3123,7 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h // Fill the shared constant buffer. // We don't fill directly the one in the parameter struct because we will need those parameters for volumetric lighting as well. - ref var cb = ref (buildForProbeVolumes ? ref m_ShaderVariablesProbeVolumeLightListCB : ref m_ShaderVariablesLightListCB); + ref var cb = ref constantBuffer; var temp = new Matrix4x4(); temp.SetRow(0, new Vector4(0.5f * w, 0.0f, 0.0f, 0.5f * w)); temp.SetRow(1, new Vector4(0.0f, 0.5f * h, 0.0f, 0.5f * h)); @@ -3160,7 +3163,6 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h } var decalDatasCount = Math.Min(DecalSystem.m_DecalDatasCount, m_MaxDecalsOnScreen); - int totalLightCount = buildForProbeVolumes ? m_ProbeVolumeCount : m_TotalLightCount; cb.g_iNrVisibLights = totalLightCount; cb.g_screenSize = hdCamera.screenSize; // TODO remove and use global one. @@ -3180,7 +3182,7 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h // Copy the constant buffer into the parameter struct. parameters.lightListCB = cb; - parameters.totalLightCount = buildForProbeVolumes ? m_ProbeVolumeCount : m_TotalLightCount; + parameters.totalLightCount = totalLightCount; parameters.runLightList = parameters.totalLightCount > 0; parameters.clearLightLists = false; @@ -3196,9 +3198,6 @@ unsafe BuildGPULightListParameters PrepareBuildGPULightListParameters(HDCamera h tileAndClusterData.listsAreClear = true; } else if (parameters.runLightList) - { - m_TileAndClusterData.listsAreClear = false; - } { tileAndClusterData.listsAreClear = false; } @@ -3325,7 +3324,7 @@ void BuildGPULightListProbeVolumesCommon(HDCamera hdCamera, CommandBuffer cmd) using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.BuildGPULightListProbeVolumes))) { - var parameters = PrepareBuildGPULightListParameters(hdCamera, buildForProbeVolumes: true); + var parameters = PrepareBuildGPULightListParameters(hdCamera, m_ProbeVolumeClusterData, ref m_ShaderVariablesProbeVolumeLightListCB, m_ProbeVolumeCount); var resources = PrepareBuildGPULightListResources( m_ProbeVolumeClusterData, m_SharedRTManager.GetDepthStencilBuffer(hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA)), @@ -3344,7 +3343,7 @@ void BuildGPULightListsCommon(HDCamera hdCamera, CommandBuffer cmd) { using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.BuildLightList))) { - var parameters = PrepareBuildGPULightListParameters(hdCamera, buildForProbeVolumes: false); + var parameters = PrepareBuildGPULightListParameters(hdCamera, m_TileAndClusterData, ref m_ShaderVariablesLightListCB, m_TotalLightCount); var resources = PrepareBuildGPULightListResources( m_TileAndClusterData, m_SharedRTManager.GetDepthStencilBuffer(hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA)), @@ -3758,8 +3757,10 @@ DeferredLightingParameters PrepareDeferredLightingParameters(HDCamera hdCamera, struct DeferredLightingResources { public RenderTargetIdentifier[] colorBuffers; + public RTHandle depthStencilBuffer; public RTHandle depthTexture; + public ComputeBuffer lightListBuffer; public ComputeBuffer tileFeatureFlagsBuffer; public ComputeBuffer tileListBuffer; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs index 7526aa22fbd..7d6c9c853ef 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs @@ -95,7 +95,7 @@ BuildGPULightListOutput BuildGPULightList(RenderGraph renderGraph, HDCamera hdCa passData.shadowGlobalParameters = PrepareShadowGlobalParameters(hdCamera); passData.lightLoopGlobalParameters = PrepareLightLoopGlobalParameters(hdCamera, m_TileAndClusterData); - passData.buildGPULightListParameters = PrepareBuildGPULightListParameters(hdCamera, buildForProbeVolumes: false); + passData.buildGPULightListParameters = PrepareBuildGPULightListParameters(hdCamera, m_TileAndClusterData, ref m_ShaderVariablesLightListCB, m_TotalLightCount); passData.depthBuffer = builder.ReadTexture(depthStencilBuffer); passData.stencilTexture = builder.ReadTexture(stencilBufferCopy); if (passData.buildGPULightListParameters.computeMaterialVariants && passData.buildGPULightListParameters.enableFeatureVariants) @@ -190,7 +190,6 @@ TextureHandle CreateDiffuseLightingBuffer(RenderGraph renderGraph, bool msaa) class DeferredLightingPassData { public DeferredLightingParameters parameters; - public DeferredLightingResources resources; public TextureHandle colorBuffer; public TextureHandle sssDiffuseLightingBuffer; @@ -200,6 +199,11 @@ class DeferredLightingPassData public int gbufferCount; public int lightLayersTextureIndex; public TextureHandle[] gbuffer = new TextureHandle[8]; + + public ComputeBufferHandle lightListBuffer; + public ComputeBufferHandle tileFeatureFlagsBuffer; + public ComputeBufferHandle tileListBuffer; + public ComputeBufferHandle dispatchIndirectBuffer; } struct LightingOutput @@ -209,12 +213,13 @@ struct LightingOutput LightingOutput RenderDeferredLighting( RenderGraph renderGraph, HDCamera hdCamera, - TextureHandle colorBuffer, - TextureHandle depthStencilBuffer, - TextureHandle depthPyramidTexture, + TextureHandle colorBuffer, + TextureHandle depthStencilBuffer, + TextureHandle depthPyramidTexture, in LightingBuffers lightingBuffers, in GBufferOutput gbuffer, - in ShadowResult shadowResult) + in ShadowResult shadowResult, + in BuildGPULightListOutput lightLists) { if (hdCamera.frameSettings.litShaderMode != LitShaderMode.Deferred) return new LightingOutput(); @@ -223,13 +228,6 @@ LightingOutput RenderDeferredLighting( RenderGraph renderGraph, { passData.parameters = PrepareDeferredLightingParameters(hdCamera, m_CurrentDebugDisplaySettings); - // TODO: Move this inside the render function onces compute buffers are RenderGraph ready - passData.resources = new DeferredLightingResources(); - passData.resources.lightListBuffer = m_TileAndClusterData.lightList; - passData.resources.tileFeatureFlagsBuffer = m_TileAndClusterData.tileFeatureFlags; - passData.resources.tileListBuffer = m_TileAndClusterData.tileList; - passData.resources.dispatchIndirectBuffer = m_TileAndClusterData.dispatchIndirectBuffer; - passData.colorBuffer = builder.WriteTexture(colorBuffer); if (passData.parameters.outputSplitLighting) { @@ -245,6 +243,7 @@ LightingOutput RenderDeferredLighting( RenderGraph renderGraph, passData.depthBuffer = builder.ReadTexture(depthStencilBuffer); passData.depthTexture = builder.ReadTexture(depthPyramidTexture); + // TODO RENDERGRAPH: Check why this is needed ReadLightingBuffers(lightingBuffers, builder); passData.lightLayersTextureIndex = gbuffer.lightLayersTextureIndex; @@ -254,19 +253,31 @@ LightingOutput RenderDeferredLighting( RenderGraph renderGraph, HDShadowManager.ReadShadowResult(shadowResult, builder); + passData.lightListBuffer = builder.ReadComputeBuffer(lightLists.lightList); + passData.tileFeatureFlagsBuffer = builder.ReadComputeBuffer(lightLists.tileFeatureFlags); + passData.tileListBuffer = builder.ReadComputeBuffer(lightLists.tileList); + passData.dispatchIndirectBuffer = builder.ReadComputeBuffer(lightLists.dispatchIndirectBuffer); + var output = new LightingOutput(); output.colorBuffer = passData.colorBuffer; builder.SetRenderFunc( (DeferredLightingPassData data, RenderGraphContext context) => { - data.resources.colorBuffers = context.renderGraphPool.GetTempArray(2); - data.resources.colorBuffers[0] = context.resources.GetTexture(data.colorBuffer); - data.resources.colorBuffers[1] = context.resources.GetTexture(data.sssDiffuseLightingBuffer); - data.resources.depthStencilBuffer = context.resources.GetTexture(data.depthBuffer); - data.resources.depthTexture = context.resources.GetTexture(data.depthTexture); + var resources = new DeferredLightingResources(); + + resources.colorBuffers = context.renderGraphPool.GetTempArray(2); + resources.colorBuffers[0] = context.resources.GetTexture(data.colorBuffer); + resources.colorBuffers[1] = context.resources.GetTexture(data.sssDiffuseLightingBuffer); + resources.depthStencilBuffer = context.resources.GetTexture(data.depthBuffer); + resources.depthTexture = context.resources.GetTexture(data.depthTexture); + + resources.lightListBuffer = context.resources.GetComputeBuffer(data.lightListBuffer); + resources.tileFeatureFlagsBuffer = context.resources.GetComputeBuffer(data.tileFeatureFlagsBuffer); + resources.tileListBuffer = context.resources.GetComputeBuffer(data.tileListBuffer); + resources.dispatchIndirectBuffer = context.resources.GetComputeBuffer(data.dispatchIndirectBuffer); - // TODO: try to find a better way to bind this. + // RENDERGRAPH TODO: try to find a better way to bind this. // Issue is that some GBuffers have several names (for example normal buffer is both NormalBuffer and GBuffer1) // So it's not possible to use auto binding via dependency to shaderTagID // Should probably get rid of auto binding and go explicit all the way (might need to wait for us to remove non rendergraph code path). @@ -282,13 +293,13 @@ LightingOutput RenderDeferredLighting( RenderGraph renderGraph, { bool useCompute = data.parameters.useComputeLightingEvaluation && !k_PreferFragment; if (useCompute) - RenderComputeDeferredLighting(data.parameters, data.resources, context.cmd); + RenderComputeDeferredLighting(data.parameters, resources, context.cmd); else - RenderComputeAsPixelDeferredLighting(data.parameters, data.resources, context.cmd); + RenderComputeAsPixelDeferredLighting(data.parameters, resources, context.cmd); } else { - RenderPixelDeferredLighting(data.parameters, data.resources, context.cmd); + RenderPixelDeferredLighting(data.parameters, resources, context.cmd); } }); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index 3cac5da4cf9..e2bdb25dca7 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -118,7 +118,7 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, StartXRSinglePass(m_RenderGraph, hdCamera); - var deferredLightingOutput = RenderDeferredLighting(m_RenderGraph, hdCamera, colorBuffer, prepassOutput.depthBuffer, prepassOutput.depthPyramidTexture, lightingBuffers, prepassOutput.gbuffer, shadowResult); + var deferredLightingOutput = RenderDeferredLighting(m_RenderGraph, hdCamera, colorBuffer, prepassOutput.depthBuffer, prepassOutput.depthPyramidTexture, lightingBuffers, prepassOutput.gbuffer, shadowResult, gpuLightListOutput); RenderForwardOpaque(m_RenderGraph, hdCamera, colorBuffer, lightingBuffers, prepassOutput.depthBuffer, shadowResult, prepassOutput.dbuffer, cullingResults); From 7ea24ae9cca4d51330b0ea00ef15def5b9f60008 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 20 Apr 2020 12:15:50 +0200 Subject: [PATCH 11/12] Use new light list build ouptut for contact shadow pass --- .../Runtime/Lighting/LightLoop/LightLoop.cs | 8 ++++---- .../Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs | 8 ++++---- .../RenderPipeline/HDRenderPipeline.RenderGraph.cs | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs index cc17738c189..063d1223ba2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.cs @@ -3646,7 +3646,7 @@ static void RenderContactShadows( in ContactShadowsParameters parameters, RTHandle contactShadowRT, RTHandle depthTexture, LightLoopLightData lightLoopLightData, - TileAndClusterData tileAndClusterData, + ComputeBuffer lightList, CommandBuffer cmd) { @@ -3657,7 +3657,7 @@ static void RenderContactShadows( in ContactShadowsParameters parameters, // Send light list to the compute cmd.SetComputeBufferParam(parameters.contactShadowsCS, parameters.kernel, HDShaderIDs._LightDatas, lightLoopLightData.lightData); - cmd.SetComputeBufferParam(parameters.contactShadowsCS, parameters.kernel, HDShaderIDs.g_vLightListGlobal, tileAndClusterData.lightList); + cmd.SetComputeBufferParam(parameters.contactShadowsCS, parameters.kernel, HDShaderIDs.g_vLightListGlobal, lightList); cmd.SetComputeTextureParam(parameters.contactShadowsCS, parameters.kernel, parameters.depthTextureParameterName, depthTexture); cmd.SetComputeTextureParam(parameters.contactShadowsCS, parameters.kernel, HDShaderIDs._ContactShadowTextureUAV, contactShadowRT); @@ -3676,7 +3676,7 @@ static void RenderContactShadows( in ContactShadowsParameters parameters, // Send light list to the compute cmd.SetRayTracingBufferParam(parameters.contactShadowsRTS, HDShaderIDs._LightDatas, lightLoopLightData.lightData); - cmd.SetRayTracingBufferParam(parameters.contactShadowsRTS, HDShaderIDs.g_vLightListGlobal, tileAndClusterData.lightList); + cmd.SetRayTracingBufferParam(parameters.contactShadowsRTS, HDShaderIDs.g_vLightListGlobal, lightList); cmd.SetRayTracingTextureParam(parameters.contactShadowsRTS, HDShaderIDs._DepthTexture, depthTexture); cmd.SetRayTracingTextureParam(parameters.contactShadowsRTS, HDShaderIDs._ContactShadowTextureUAV, contactShadowRT); @@ -3698,7 +3698,7 @@ void RenderContactShadows(HDCamera hdCamera, CommandBuffer cmd) var depthTexture = hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA) ? m_SharedRTManager.GetDepthValuesTexture() : m_SharedRTManager.GetDepthTexture(); int firstMipOffsetY = m_SharedRTManager.GetDepthBufferMipChainInfo().mipLevelOffsets[1].y; var parameters = PrepareContactShadowsParameters(hdCamera, firstMipOffsetY); - RenderContactShadows(parameters, m_ContactShadowBuffer, depthTexture, m_LightLoopLightData, m_TileAndClusterData, cmd); + RenderContactShadows(parameters, m_ContactShadowBuffer, depthTexture, m_LightLoopLightData, m_TileAndClusterData.lightList, cmd); } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs index 7d6c9c853ef..e1985d4ccfb 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs @@ -408,13 +408,13 @@ class RenderContactShadowPassData { public ContactShadowsParameters parameters; public LightLoopLightData lightLoopLightData; - public TileAndClusterData tileAndClusterData; public TextureHandle depthTexture; public TextureHandle contactShadowsTexture; + public ComputeBufferHandle lightList; public HDShadowManager shadowManager; } - TextureHandle RenderContactShadows(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthTexture, int firstMipOffsetY) + TextureHandle RenderContactShadows(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthTexture, BuildGPULightListOutput lightLists, int firstMipOffsetY) { if (!WillRenderContactShadow()) return renderGraph.ImportTexture(TextureXR.GetClearTexture(), HDShaderIDs._ContactShadowTexture); @@ -429,7 +429,7 @@ TextureHandle RenderContactShadows(RenderGraph renderGraph, HDCamera hdCamera, T passData.parameters = PrepareContactShadowsParameters(hdCamera, firstMipOffsetY); passData.lightLoopLightData = m_LightLoopLightData; - passData.tileAndClusterData = m_TileAndClusterData; + passData.lightList = builder.ReadComputeBuffer(lightLists.lightList); passData.depthTexture = builder.ReadTexture(depthTexture); passData.shadowManager = m_ShadowManager; passData.contactShadowsTexture = builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) @@ -443,7 +443,7 @@ TextureHandle RenderContactShadows(RenderGraph renderGraph, HDCamera hdCamera, T var res = context.resources; data.shadowManager.PushGlobalParameters(context.cmd); - RenderContactShadows(data.parameters, res.GetTexture(data.contactShadowsTexture), res.GetTexture(data.depthTexture), data.lightLoopLightData, data.tileAndClusterData, context.cmd); + RenderContactShadows(data.parameters, res.GetTexture(data.contactShadowsTexture), res.GetTexture(data.depthTexture), data.lightLoopLightData, res.GetComputeBuffer(data.lightList), context.cmd); }); } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index e2bdb25dca7..f3a94e8210b 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -80,7 +80,7 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, prepassOutput.stencilBuffer, clearCoatMask); - lightingBuffers.contactShadowsBuffer = RenderContactShadows(m_RenderGraph, hdCamera, msaa ? prepassOutput.depthValuesMSAA : prepassOutput.depthPyramidTexture, GetDepthBufferMipChainInfo().mipLevelOffsets[1].y); + lightingBuffers.contactShadowsBuffer = RenderContactShadows(m_RenderGraph, hdCamera, msaa ? prepassOutput.depthValuesMSAA : prepassOutput.depthPyramidTexture, gpuLightListOutput, GetDepthBufferMipChainInfo().mipLevelOffsets[1].y); var volumetricDensityBuffer = VolumeVoxelizationPass(m_RenderGraph, hdCamera, m_VisibleVolumeBoundsBuffer, m_VisibleVolumeDataBuffer, m_TileAndClusterData.bigTileLightList, m_FrameCount); From 955482137add60336fd3cae73e14ec8abbed7d8b Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 20 Apr 2020 13:41:22 +0200 Subject: [PATCH 12/12] Use new light list build ouptut for volumetric passes --- .../HDRenderPipeline.LightLoop.cs | 29 ++++++++++--------- .../HDRenderPipeline.RenderGraph.cs | 4 +-- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs index e1985d4ccfb..695f1f899a7 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.LightLoop.cs @@ -455,17 +455,17 @@ class VolumeVoxelizationPassData { public VolumeVoxelizationParameters parameters; public TextureHandle densityBuffer; + public ComputeBufferHandle bigTileLightListBuffer; public ComputeBuffer visibleVolumeBoundsBuffer; public ComputeBuffer visibleVolumeDataBuffer; - public ComputeBuffer bigTileLightListBuffer; } - TextureHandle VolumeVoxelizationPass( RenderGraph renderGraph, - HDCamera hdCamera, - ComputeBuffer visibleVolumeBoundsBuffer, - ComputeBuffer visibleVolumeDataBuffer, - ComputeBuffer bigTileLightListBuffer, - int frameIndex) + TextureHandle VolumeVoxelizationPass( RenderGraph renderGraph, + HDCamera hdCamera, + ComputeBuffer visibleVolumeBoundsBuffer, + ComputeBuffer visibleVolumeDataBuffer, + ComputeBufferHandle bigTileLightList, + int frameIndex) { if (Fog.IsVolumetricFogEnabled(hdCamera)) { @@ -476,7 +476,7 @@ TextureHandle VolumeVoxelizationPass( RenderGraph renderGraph, passData.parameters = PrepareVolumeVoxelizationParameters(hdCamera, frameIndex); passData.visibleVolumeBoundsBuffer = visibleVolumeBoundsBuffer; passData.visibleVolumeDataBuffer = visibleVolumeDataBuffer; - passData.bigTileLightListBuffer = bigTileLightListBuffer; + passData.bigTileLightListBuffer = builder.ReadComputeBuffer(bigTileLightList); float tileSize = 0; Vector3Int viewportSize = ComputeVolumetricViewportSize(hdCamera, ref tileSize); @@ -494,11 +494,11 @@ TextureHandle VolumeVoxelizationPass( RenderGraph renderGraph, builder.SetRenderFunc( (VolumeVoxelizationPassData data, RenderGraphContext ctx) => { - VolumeVoxelizationPass(data.parameters, + VolumeVoxelizationPass( data.parameters, ctx.resources.GetTexture(data.densityBuffer), data.visibleVolumeBoundsBuffer, data.visibleVolumeDataBuffer, - data.bigTileLightListBuffer, + ctx.resources.GetComputeBuffer(data.bigTileLightListBuffer), ctx.cmd); }); @@ -515,10 +515,10 @@ class VolumetricLightingPassData public TextureHandle lightingBuffer; public TextureHandle historyBuffer; public TextureHandle feedbackBuffer; - public ComputeBuffer bigTileLightListBuffer; + public ComputeBufferHandle bigTileLightListBuffer; } - TextureHandle VolumetricLightingPass(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle densityBuffer, ComputeBuffer bigTileLightListBuffer, ShadowResult shadowResult, int frameIndex) + TextureHandle VolumetricLightingPass(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle densityBuffer, ComputeBufferHandle bigTileLightListBuffer, ShadowResult shadowResult, int frameIndex) { if (Fog.IsVolumetricFogEnabled(hdCamera)) { @@ -526,10 +526,11 @@ TextureHandle VolumetricLightingPass(RenderGraph renderGraph, HDCamera hdCamera, using (var builder = renderGraph.AddRenderPass("Volumetric Lighting", out var passData)) { + // TODO RENDERGRAPH //builder.EnableAsyncCompute(hdCamera.frameSettings.VolumetricLightingRunsAsync()); passData.parameters = parameters; - passData.bigTileLightListBuffer = bigTileLightListBuffer; + passData.bigTileLightListBuffer = builder.ReadComputeBuffer(bigTileLightListBuffer); passData.densityBuffer = builder.ReadTexture(densityBuffer); float tileSize = 0; @@ -566,7 +567,7 @@ TextureHandle VolumetricLightingPass(RenderGraph renderGraph, HDCamera hdCamera, lightinBufferRT, data.parameters.enableReprojection ? ctx.resources.GetTexture(data.historyBuffer) : null, data.parameters.enableReprojection ? ctx.resources.GetTexture(data.feedbackBuffer) : null, - data.bigTileLightListBuffer, + ctx.resources.GetComputeBuffer(data.bigTileLightListBuffer), ctx.cmd); if (data.parameters.filterVolume) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index f3a94e8210b..497c5984b3a 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -82,7 +82,7 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, lightingBuffers.contactShadowsBuffer = RenderContactShadows(m_RenderGraph, hdCamera, msaa ? prepassOutput.depthValuesMSAA : prepassOutput.depthPyramidTexture, gpuLightListOutput, GetDepthBufferMipChainInfo().mipLevelOffsets[1].y); - var volumetricDensityBuffer = VolumeVoxelizationPass(m_RenderGraph, hdCamera, m_VisibleVolumeBoundsBuffer, m_VisibleVolumeDataBuffer, m_TileAndClusterData.bigTileLightList, m_FrameCount); + var volumetricDensityBuffer = VolumeVoxelizationPass(m_RenderGraph, hdCamera, m_VisibleVolumeBoundsBuffer, m_VisibleVolumeDataBuffer, gpuLightListOutput.bigTileLightList, m_FrameCount); shadowResult = RenderShadows(m_RenderGraph, hdCamera, cullingResults); @@ -114,7 +114,7 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, // hdCamera.xr.StopSinglePass(cmd); //} - var volumetricLighting = VolumetricLightingPass(m_RenderGraph, hdCamera, volumetricDensityBuffer, m_TileAndClusterData.bigTileLightList, shadowResult, m_FrameCount); + var volumetricLighting = VolumetricLightingPass(m_RenderGraph, hdCamera, volumetricDensityBuffer, gpuLightListOutput.bigTileLightList, shadowResult, m_FrameCount); StartXRSinglePass(m_RenderGraph, hdCamera);