using System;
namespace UnityEngine.Rendering.Universal.Internal
{
///
/// Calculate min and max depth per screen tile for tiled-based deferred shading.
///
internal class TileDepthRangePass : ScriptableRenderPass
{
DeferredLights m_DeferredLights;
int m_PassIndex = 0;
public TileDepthRangePass(RenderPassEvent evt, DeferredLights deferredLights, int passIndex)
{
base.profilingSampler = new ProfilingSampler(nameof(TileDepthRangePass));
base.renderPassEvent = evt;
m_DeferredLights = deferredLights;
m_PassIndex = passIndex;
}
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
RenderTargetHandle outputTex;
RenderTextureDescriptor desc;
if (m_PassIndex == 0 && m_DeferredLights.HasTileDepthRangeExtraPass())
{
int alignment = 1 << DeferredConfig.kTileDepthInfoIntermediateLevel;
int depthInfoWidth = (m_DeferredLights.RenderWidth + alignment - 1) >> DeferredConfig.kTileDepthInfoIntermediateLevel;
int depthInfoHeight = (m_DeferredLights.RenderHeight + alignment - 1) >> DeferredConfig.kTileDepthInfoIntermediateLevel;
outputTex = m_DeferredLights.DepthInfoTexture;
desc = new RenderTextureDescriptor(depthInfoWidth, depthInfoHeight, UnityEngine.Experimental.Rendering.GraphicsFormat.R32_UInt, 0);
}
else
{
int tileDepthRangeWidth = m_DeferredLights.GetTiler(0).TileXCount;
int tileDepthRangeHeight = m_DeferredLights.GetTiler(0).TileYCount;
outputTex = m_DeferredLights.TileDepthInfoTexture;
desc = new RenderTextureDescriptor(tileDepthRangeWidth, tileDepthRangeHeight, UnityEngine.Experimental.Rendering.GraphicsFormat.R32_UInt, 0);
}
cmd.GetTemporaryRT(outputTex.id, desc, FilterMode.Point);
base.ConfigureTarget(outputTex.Identifier());
}
///
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (m_PassIndex == 0)
m_DeferredLights.ExecuteTileDepthInfoPass(context, ref renderingData);
else
m_DeferredLights.ExecuteDownsampleBitmaskPass(context, ref renderingData);
}
///
public override void OnCameraCleanup(CommandBuffer cmd)
{
if (cmd == null)
throw new ArgumentNullException("cmd");
cmd.ReleaseTemporaryRT(m_DeferredLights.TileDepthInfoTexture.id);
m_DeferredLights.TileDepthInfoTexture = RenderTargetHandle.CameraTarget;
}
}
}