Skip to content

Commit

Permalink
Skip passes when everything is disabled in frame settings (#2279)
Browse files Browse the repository at this point in the history
* Fix rendergraph default resources init

* Make sure passes are skipped when opaque and transparents objects are off

* Skip pre render sky if backplate is disabled (? can we do this?)

* More generic name for the pre render sky (in case is not tied to backplate in custom code)

* Skip clear stencil

* Use sanitization instead of checking opaque explicitly

* Some merging of settings

* missing transparent
  • Loading branch information
FrancescoC-unity authored and sebastienlagarde committed Oct 25, 2020
1 parent 04b5635 commit d98cffe
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,6 @@ public RenderGraphDefaultResources defaultResources
{
get
{
m_DefaultResources.InitializeForRendering(this);
return m_DefaultResources;
}
}
Expand Down Expand Up @@ -435,6 +434,7 @@ public void Begin(in RenderGraphParameters parameters)
m_Logger.Initialize();

m_Resources.BeginRender(parameters.currentFrameIndex, m_ExecutionCount);
m_DefaultResources.InitializeForRendering(this);

m_RenderGraphContext.cmd = parameters.commandBuffer;
m_RenderGraphContext.renderContext = parameters.scriptableRenderContext;
Expand Down Expand Up @@ -555,7 +555,6 @@ internal void ClearCompiledGraph()
{
ClearRenderPasses();
m_Resources.Clear(m_ExecutionExceptionWasRaised);
m_DefaultResources.Clear();
m_RendererLists.Clear();
for (int i = 0; i < (int)RenderGraphResourceType.Count; ++i)
m_CompiledResourcesInfos[i].Clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,29 +46,18 @@ internal void Cleanup()

internal void InitializeForRendering(RenderGraph renderGraph)
{
if (!m_IsValid)
{
blackTexture = renderGraph.ImportTexture(m_BlackTexture2D);
whiteTexture = renderGraph.ImportTexture(m_WhiteTexture2D);

clearTextureXR = renderGraph.ImportTexture(TextureXR.GetClearTexture());
magentaTextureXR = renderGraph.ImportTexture(TextureXR.GetMagentaTexture());
blackTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture());
blackTextureArrayXR = renderGraph.ImportTexture(TextureXR.GetBlackTextureArray());
blackUIntTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackUIntTexture());
blackTexture3DXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture3D());
whiteTextureXR = renderGraph.ImportTexture(TextureXR.GetWhiteTexture());

m_IsValid = true;
}
blackTexture = renderGraph.ImportTexture(m_BlackTexture2D);
whiteTexture = renderGraph.ImportTexture(m_WhiteTexture2D);

clearTextureXR = renderGraph.ImportTexture(TextureXR.GetClearTexture());
magentaTextureXR = renderGraph.ImportTexture(TextureXR.GetMagentaTexture());
blackTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture());
blackTextureArrayXR = renderGraph.ImportTexture(TextureXR.GetBlackTextureArray());
blackUIntTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackUIntTexture());
blackTexture3DXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture3D());
whiteTextureXR = renderGraph.ImportTexture(TextureXR.GetWhiteTexture());
}

// Imported resources are cleared everytime the Render Graph is executed, so we need to know if that happens
// so that we can re-import all default resources if needed.
internal void Clear()
{
m_IsValid = false;
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ internal static ShadowResult ReadShadowResult(in ShadowResult shadowResult, Rend
internal void RenderShadows(RenderGraph renderGraph, in ShaderVariablesGlobal globalCB, HDCamera hdCamera, CullingResults cullResults, ref ShadowResult result)
{
// Avoid to do any commands if there is no shadow to draw
if (m_ShadowRequestCount != 0)
if (m_ShadowRequestCount != 0 &&
(hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects) || hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)))
{
cachedShadowManager.punctualShadowAtlas.RenderShadows(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Cached Punctual Lights Shadows rendering", ref result.cachedPunctualShadowResult);
cachedShadowManager.punctualShadowAtlas.AddBlitRequestsForUpdatedShadows(m_Atlas);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,14 @@ bool RenderDepthPrepass(RenderGraph renderGraph, CullingResults cull, HDCamera h
bool msaa = hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA);
bool decalLayersEnabled = hdCamera.frameSettings.IsEnabled(FrameSettingsField.DecalLayers);

if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
decalBuffer = renderGraph.defaultResources.blackTextureXR;
output.depthAsColor = renderGraph.defaultResources.blackTextureXR;
output.normalBuffer = CreateNormalBuffer(renderGraph, msaa);
return false;
}

using (var builder = renderGraph.AddRenderPass<DepthPrepassData>(depthPrepassParameters.passName, out var passData, ProfilingSampler.Get(depthPrepassParameters.profilingId)))
{
passData.frameSettings = hdCamera.frameSettings;
Expand Down Expand Up @@ -398,7 +406,8 @@ class ObjectMotionVectorsPassData

void RenderObjectsMotionVectors(RenderGraph renderGraph, CullingResults cull, HDCamera hdCamera, TextureHandle decalBuffer, in PrepassOutput output)
{
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.ObjectMotionVectors))
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.ObjectMotionVectors) ||
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
return;

using (var builder = renderGraph.AddRenderPass<ObjectMotionVectorsPassData>("Objects Motion Vectors Rendering", out var passData, ProfilingSampler.Get(HDProfileId.ObjectsMotionVector)))
Expand Down Expand Up @@ -533,7 +542,8 @@ static void BindProbeVolumeGlobalData(in FrameSettings frameSettings, GBufferPas
// during Gbuffer pass. This is handled in the shader and the depth test (equal and no depth write) is done here.
void RenderGBuffer(RenderGraph renderGraph, TextureHandle sssBuffer, TextureHandle vtFeedbackBuffer, ref PrepassOutput prepassOutput, in BuildGPULightListOutput probeVolumeLightList, CullingResults cull, HDCamera hdCamera)
{
if (hdCamera.frameSettings.litShaderMode != LitShaderMode.Deferred)
if (hdCamera.frameSettings.litShaderMode != LitShaderMode.Deferred ||
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
prepassOutput.gbuffer.gBufferCount = 0;
return;
Expand Down Expand Up @@ -651,6 +661,12 @@ class CopyDepthPassData

void CopyDepthBufferIfNeeded(RenderGraph renderGraph, HDCamera hdCamera, ref PrepassOutput output)
{
if(!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
output.depthPyramidTexture = renderGraph.defaultResources.blackTextureXR;
return;
}

if (!m_IsDepthBufferCopyValid)
{
using (var builder = renderGraph.AddRenderPass<CopyDepthPassData>("Copy depth buffer", out var passData, ProfilingSampler.Get(HDProfileId.CopyDepthBuffer)))
Expand Down Expand Up @@ -783,7 +799,8 @@ void RenderDBuffer(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle dec
{
bool use4RTs = m_Asset.currentPlatformRenderPipelineSettings.decalSettings.perChannelMask;

if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals))
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals) ||
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
// Return all black textures for default values.
var blackTexture = renderGraph.defaultResources.blackTextureXR;
Expand Down Expand Up @@ -854,7 +871,8 @@ void DecalNormalPatch(RenderGraph renderGraph, HDCamera hdCamera, ref PrepassOut
}

if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals) &&
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA)) // MSAA not supported
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA) &&
hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) // MSAA not supported
{
using (var builder = renderGraph.AddRenderPass<DBufferNormalPatchData>("DBuffer Normal (forward)", out var passData, ProfilingSampler.Get(HDProfileId.DBufferNormal)))
{
Expand Down Expand Up @@ -949,6 +967,12 @@ class GenerateDepthPyramidPassData

void GenerateDepthPyramid(RenderGraph renderGraph, HDCamera hdCamera, bool mip0AlreadyComputed, ref PrepassOutput output)
{
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
output.depthPyramidTexture = renderGraph.defaultResources.blackTextureXR;
return;
}

// If the depth buffer hasn't been already copied by the decal or low res depth buffer pass, then we do the copy here.
CopyDepthBufferIfNeeded(renderGraph, hdCamera, ref output);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,11 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest,

m_PostProcessSystem.DoUserAfterOpaqueAndSky(m_RenderGraph, hdCamera, colorBuffer, prepassOutput.resolvedDepthBuffer, prepassOutput.resolvedNormalBuffer);

// No need for old stencil values here since from transparent on different features are tagged
ClearStencilBuffer(m_RenderGraph, colorBuffer, prepassOutput.depthBuffer);
if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) // If we don't have opaque objects there is no need to clear.
{
// No need for old stencil values here since from transparent on different features are tagged
ClearStencilBuffer(m_RenderGraph, colorBuffer, prepassOutput.depthBuffer);
}

colorBuffer = RenderTransparency(m_RenderGraph, hdCamera, colorBuffer, vtFeedbackBuffer, currentColorPyramid, volumetricLighting, rayCountTexture, m_SkyManager.GetSkyReflection(hdCamera), gpuLightListOutput, ref prepassOutput, shadowResult, cullingResults, customPassCullingResults, aovRequest, aovBuffers);

Expand Down Expand Up @@ -512,6 +515,9 @@ void RenderForwardOpaque( RenderGraph renderGraph,
{
bool debugDisplay = m_CurrentDebugDisplaySettings.IsDebugDisplayEnabled();

if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
return;

using (var builder = renderGraph.AddRenderPass<ForwardOpaquePassData>( debugDisplay ? "Forward Opaque Debug" : "Forward Opaque",
out var passData,
debugDisplay ? ProfilingSampler.Get(HDProfileId.ForwardOpaqueDebug) : ProfilingSampler.Get(HDProfileId.ForwardOpaque)))
Expand Down Expand Up @@ -573,6 +579,9 @@ void RenderForwardTransparent( RenderGraph renderGraph,
CullingResults cullResults,
bool preRefractionPass)
{
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects))
return;

// If rough refraction are turned off, we render all transparents in the Transparent pass and we skip the PreRefraction one.
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Refraction) && preRefractionPass)
return;
Expand Down Expand Up @@ -927,6 +936,12 @@ void RenderForwardEmissive( RenderGraph renderGraph,
TextureHandle depthStencilBuffer,
CullingResults cullingResults)
{
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects) &&
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
return;
}

using (var builder = renderGraph.AddRenderPass<RenderForwardEmissivePassData>("ForwardEmissive", out var passData, ProfilingSampler.Get(HDProfileId.ForwardEmissive)))
{
builder.UseColorBuffer(colorBuffer, 0);
Expand All @@ -953,6 +968,13 @@ void RenderForwardError(RenderGraph renderGraph,
TextureHandle depthStencilBuffer,
CullingResults cullResults)
{
if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects) &&
!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
{
return;
}


using (var builder = renderGraph.AddRenderPass<ForwardPassData>("Forward Error", out var passData, ProfilingSampler.Get(HDProfileId.RenderForwardError)))
{
builder.UseColorBuffer(colorBuffer, 0);
Expand Down Expand Up @@ -1058,7 +1080,8 @@ class PreRenderSkyPassData

void PreRenderSky(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthStencilBuffer, TextureHandle normalbuffer)
{
if (m_CurrentDebugDisplaySettings.DebugHideSky(hdCamera))
if (m_CurrentDebugDisplaySettings.DebugHideSky(hdCamera) ||
!m_SkyManager.RequiresPreRenderSky(hdCamera))
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c
// Planar and real time cubemap doesn't need post process and render in FP16
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Postprocess] &= !reflection && !preview;

sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPrepass] &= renderPipelineSettings.supportTransparentDepthPrepass && !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPrepass] &= renderPipelineSettings.supportTransparentDepthPrepass && !preview && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects];

bool motionVector = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.MotionVectors] &= renderPipelineSettings.supportMotionVectors && !preview;

Expand All @@ -783,12 +783,12 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c

sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Decals] &= renderPipelineSettings.supportDecals && !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.DecalLayers] &= renderPipelineSettings.supportDecalLayers && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Decals];
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPostpass] &= renderPipelineSettings.supportTransparentDepthPostpass && !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPostpass] &= renderPipelineSettings.supportTransparentDepthPostpass && !preview && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects];
bool distortion = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Distortion] &= renderPipelineSettings.supportDistortion && !msaa && !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.RoughDistortion] &= distortion && !msaa && !preview;


sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LowResTransparent] &= renderPipelineSettings.lowresTransparentSettings.enabled;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LowResTransparent] &= renderPipelineSettings.lowresTransparentSettings.enabled && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects];

bool async = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.AsyncCompute] &= SystemInfo.supportsAsyncCompute;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LightListAsync] &= async;
Expand All @@ -815,6 +815,9 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c
// but with the preview lights which are different from the ones in the scene and will change the result inducing flickering.
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.ReflectionProbe] &= !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.PlanarProbe] &= !preview;
sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.SubsurfaceScattering] &= sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.OpaqueObjects];
}
/// <summary>Aggregation is default with override of the renderer then sanitized depending on supported features of hdrpasset.</summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@ private Vector4 GetBackplateParameters2(HDRISky hdriSky)
return new Vector4(Mathf.Cos(localPhi), Mathf.Sin(localPhi), hdriSky.plateTexOffset.value.x, hdriSky.plateTexOffset.value.y);
}

public override bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams)
{
var hdriSky = builtinParams.skySettings as HDRISky;
return hdriSky.enableBackplate.value;
}

public override void PreRenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk)
{
var hdriSky = builtinParams.skySettings as HDRISky;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,12 @@ internal void UpdateBuiltinParameters(SkyUpdateContext skyContext, HDCamera hdCa
m_BuiltinParameters.skySettings = skyContext.skySettings;
}

public bool RequiresPreRenderSky(HDCamera hdCamera)
{
var skyContext = hdCamera.visualSky;
return skyContext.IsValid() && skyContext.skyRenderer.RequiresPreRenderSky(m_BuiltinParameters);
}

public void PreRenderSky(HDCamera hdCamera, Light sunLight, RTHandle colorBuffer, RTHandle normalBuffer, RTHandle depthBuffer, DebugDisplaySettings debugSettings, int frameIndex, CommandBuffer cmd)
{
var skyContext = hdCamera.visualSky;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ public abstract class SkyRenderer
/// <param name="renderSunDisk">If the sky renderer supports the rendering of a sun disk, it must not render it if this is set to false.</param>
public virtual void PreRenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { }

/// <summary>
/// Whether the PreRenderSky step is required.
/// </summary>
/// <param name="builtinParams">Engine parameters that you can use to render the sky.</param>
/// <returns>True if the PreRenderSky step is required.</returns>
public virtual bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) { return false; }


/// <summary>
/// Implements actual rendering of the sky. HDRP calls this when rendering the sky into a cubemap (for lighting) and also during main frame rendering.
/// </summary>
Expand Down

0 comments on commit d98cffe

Please sign in to comment.