Align URP render graph frame data scope

This commit is contained in:
2026-04-26 20:51:16 +08:00
parent ee05558f86
commit db2d3eb414
13 changed files with 918 additions and 73 deletions

View File

@@ -1173,6 +1173,297 @@ namespace Gameplay
}
}
internal static class PublicRenderGraphFrameDataProbeState
{
public static bool HasRenderingData;
public static bool HasCameraData;
public static bool HasLightingData;
public static bool HasShadowData;
public static bool HasEnvironmentData;
public static bool HasFinalColorData;
public static bool HasStageColorData;
public static bool RenderingDataMatchesItems;
public static int ObservedStage;
public static int ObservedRendererIndex;
public static void Reset()
{
HasRenderingData = false;
HasCameraData = false;
HasLightingData = false;
HasShadowData = false;
HasEnvironmentData = false;
HasFinalColorData = false;
HasStageColorData = false;
RenderingDataMatchesItems = false;
ObservedStage = -1;
ObservedRendererIndex = -1;
}
}
internal sealed class PublicRenderGraphFrameDataProbePass
: ScriptableRenderPass
{
public PublicRenderGraphFrameDataProbePass()
{
renderPassEvent = RenderPassEvent.RenderOpaques;
}
public override void RecordRenderGraph(
RenderGraph renderGraph,
ContextContainer frameData)
{
PublicRenderGraphFrameDataProbeState.HasRenderingData =
frameData != null &&
frameData.Contains<RenderingData>();
PublicRenderGraphFrameDataProbeState.HasCameraData =
frameData != null &&
frameData.Contains<CameraData>();
PublicRenderGraphFrameDataProbeState.HasLightingData =
frameData != null &&
frameData.Contains<LightingData>();
PublicRenderGraphFrameDataProbeState.HasShadowData =
frameData != null &&
frameData.Contains<ShadowData>();
PublicRenderGraphFrameDataProbeState.HasEnvironmentData =
frameData != null &&
frameData.Contains<EnvironmentData>();
PublicRenderGraphFrameDataProbeState.HasFinalColorData =
frameData != null &&
frameData.Contains<FinalColorData>();
PublicRenderGraphFrameDataProbeState.HasStageColorData =
frameData != null &&
frameData.Contains<StageColorData>();
if (!PublicRenderGraphFrameDataProbeState.HasRenderingData)
{
return;
}
RenderingData renderingData =
frameData.Get<RenderingData>();
PublicRenderGraphFrameDataProbeState.ObservedStage =
(int)renderingData.stage;
PublicRenderGraphFrameDataProbeState.ObservedRendererIndex =
renderingData.rendererIndex;
PublicRenderGraphFrameDataProbeState
.RenderingDataMatchesItems =
object.ReferenceEquals(
renderingData.cameraData,
frameData.Get<CameraData>()) &&
object.ReferenceEquals(
renderingData.lightingData,
frameData.Get<LightingData>()) &&
object.ReferenceEquals(
renderingData.shadowData,
frameData.Get<ShadowData>()) &&
object.ReferenceEquals(
renderingData.environmentData,
frameData.Get<EnvironmentData>()) &&
object.ReferenceEquals(
renderingData.finalColorData,
frameData.Get<FinalColorData>()) &&
object.ReferenceEquals(
renderingData.stageColorData,
frameData.Get<StageColorData>());
}
}
internal sealed class PublicRenderGraphFrameDataProbeFeature
: ScriptableRendererFeature
{
private readonly PublicRenderGraphFrameDataProbePass m_pass =
new PublicRenderGraphFrameDataProbePass();
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isMainSceneStage)
{
return;
}
renderer.EnqueuePass(m_pass);
}
}
internal sealed class PublicRenderGraphFrameDataProbeRenderer
: ScriptableRenderer
{
public PublicRenderGraphFrameDataProbeRenderer()
{
AddFeature(new PublicRenderGraphFrameDataProbeFeature());
}
}
internal sealed class PublicRenderGraphSharedFrameDataProbeItem
: ContextItem
{
public int Value;
public int WriterOrder;
public RenderingData RenderingData;
public PublicRenderGraphSharedFrameDataProbeItem()
{
}
public override void Reset()
{
Value = 0;
WriterOrder = 0;
RenderingData = null;
}
}
internal static class PublicRenderGraphSharedFrameDataProbeState
{
public static bool WriterVisited;
public static bool ReaderVisited;
public static bool ReaderObservedWriterItem;
public static bool ReaderObservedSameFrameData;
public static bool ReaderObservedSameRenderingData;
public static int ReaderObservedValue;
public static int ReaderOrder;
public static ContextContainer WriterFrameData;
public static int NextOrder;
public static void Reset()
{
WriterVisited = false;
ReaderVisited = false;
ReaderObservedWriterItem = false;
ReaderObservedSameFrameData = false;
ReaderObservedSameRenderingData = false;
ReaderObservedValue = 0;
ReaderOrder = 0;
WriterFrameData = null;
NextOrder = 0;
}
}
internal sealed class PublicRenderGraphSharedFrameDataWriterPass
: ScriptableRenderPass
{
public PublicRenderGraphSharedFrameDataWriterPass()
{
renderPassEvent = RenderPassEvent.RenderOpaques;
}
public override void RecordRenderGraph(
RenderGraph renderGraph,
ContextContainer frameData)
{
PublicRenderGraphSharedFrameDataProbeState.WriterVisited =
frameData != null;
PublicRenderGraphSharedFrameDataProbeState.WriterFrameData =
frameData;
if (frameData == null)
{
return;
}
PublicRenderGraphSharedFrameDataProbeItem item =
frameData
.GetOrCreate<PublicRenderGraphSharedFrameDataProbeItem>();
item.Value = 73;
item.WriterOrder =
++PublicRenderGraphSharedFrameDataProbeState.NextOrder;
item.RenderingData =
frameData.Contains<RenderingData>()
? frameData.Get<RenderingData>()
: null;
}
}
internal sealed class PublicRenderGraphSharedFrameDataReaderPass
: ScriptableRenderPass
{
public PublicRenderGraphSharedFrameDataReaderPass()
{
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
}
public override void RecordRenderGraph(
RenderGraph renderGraph,
ContextContainer frameData)
{
PublicRenderGraphSharedFrameDataProbeState.ReaderVisited =
frameData != null;
PublicRenderGraphSharedFrameDataProbeState.ReaderOrder =
++PublicRenderGraphSharedFrameDataProbeState.NextOrder;
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedSameFrameData =
object.ReferenceEquals(
PublicRenderGraphSharedFrameDataProbeState
.WriterFrameData,
frameData);
if (frameData == null ||
!frameData
.Contains<PublicRenderGraphSharedFrameDataProbeItem>())
{
return;
}
PublicRenderGraphSharedFrameDataProbeItem item =
frameData
.Get<PublicRenderGraphSharedFrameDataProbeItem>();
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedWriterItem =
item.WriterOrder > 0 &&
item.WriterOrder <
PublicRenderGraphSharedFrameDataProbeState.ReaderOrder;
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedValue =
item.Value;
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedSameRenderingData =
frameData.Contains<RenderingData>() &&
object.ReferenceEquals(
item.RenderingData,
frameData.Get<RenderingData>());
}
}
internal sealed class PublicRenderGraphSharedFrameDataProbeFeature
: ScriptableRendererFeature
{
private readonly PublicRenderGraphSharedFrameDataWriterPass
m_writerPass =
new PublicRenderGraphSharedFrameDataWriterPass();
private readonly PublicRenderGraphSharedFrameDataReaderPass
m_readerPass =
new PublicRenderGraphSharedFrameDataReaderPass();
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isMainSceneStage)
{
return;
}
renderer.EnqueuePass(m_writerPass);
renderer.EnqueuePass(m_readerPass);
}
}
internal sealed class PublicRenderGraphSharedFrameDataProbeRenderer
: ScriptableRenderer
{
public PublicRenderGraphSharedFrameDataProbeRenderer()
{
AddFeature(
new PublicRenderGraphSharedFrameDataProbeFeature());
}
}
internal abstract class ProbeRendererData
: UniversalRendererData
{
@@ -1532,6 +1823,24 @@ namespace Gameplay
}
}
internal sealed class PublicRenderGraphFrameDataProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new PublicRenderGraphFrameDataProbeRenderer();
}
}
internal sealed class PublicRenderGraphSharedFrameDataProbeRendererData
: ProbeRendererData
{
protected override ScriptableRenderer CreateProbeRenderer()
{
return new PublicRenderGraphSharedFrameDataProbeRenderer();
}
}
internal static class ManagedLifecycleProbeState
{
public static int CreatePipelineCallCount;
@@ -2230,6 +2539,32 @@ namespace Gameplay
}
}
public sealed class ManagedPublicRenderGraphFrameDataProbeAsset
: UniversalRenderPipelineAsset
{
public ManagedPublicRenderGraphFrameDataProbeAsset()
{
rendererDataList =
ProbeScriptableObjectFactory
.CreateRendererDataList(
ProbeScriptableObjectFactory
.Create<PublicRenderGraphFrameDataProbeRendererData>());
}
}
public sealed class ManagedPublicRenderGraphSharedFrameDataProbeAsset
: UniversalRenderPipelineAsset
{
public ManagedPublicRenderGraphSharedFrameDataProbeAsset()
{
rendererDataList =
ProbeScriptableObjectFactory
.CreateRendererDataList(
ProbeScriptableObjectFactory
.Create<PublicRenderGraphSharedFrameDataProbeRendererData>());
}
}
internal sealed class ManagedMainSceneRasterPassProbePipeline
: ScriptableRenderPipeline
{
@@ -3372,5 +3707,106 @@ namespace Gameplay
StageColorObservationPass.FinalOutputRecordCallCount;
}
}
}
public sealed class ManagedPublicRenderGraphFrameDataRuntimeSelectionProbe
: MonoBehaviour
{
public bool ObservedHasRenderingData;
public bool ObservedHasCameraData;
public bool ObservedHasLightingData;
public bool ObservedHasShadowData;
public bool ObservedHasEnvironmentData;
public bool ObservedHasFinalColorData;
public bool ObservedHasStageColorData;
public bool ObservedRenderingDataMatchesItems;
public int ObservedStage;
public int ObservedRendererIndex;
public void Start()
{
PublicRenderGraphFrameDataProbeState.Reset();
GraphicsSettings.renderPipelineAsset =
ProbeScriptableObjectFactory
.Create<ManagedPublicRenderGraphFrameDataProbeAsset>();
}
public void Update()
{
ObservedHasRenderingData =
PublicRenderGraphFrameDataProbeState
.HasRenderingData;
ObservedHasCameraData =
PublicRenderGraphFrameDataProbeState
.HasCameraData;
ObservedHasLightingData =
PublicRenderGraphFrameDataProbeState
.HasLightingData;
ObservedHasShadowData =
PublicRenderGraphFrameDataProbeState
.HasShadowData;
ObservedHasEnvironmentData =
PublicRenderGraphFrameDataProbeState
.HasEnvironmentData;
ObservedHasFinalColorData =
PublicRenderGraphFrameDataProbeState
.HasFinalColorData;
ObservedHasStageColorData =
PublicRenderGraphFrameDataProbeState
.HasStageColorData;
ObservedRenderingDataMatchesItems =
PublicRenderGraphFrameDataProbeState
.RenderingDataMatchesItems;
ObservedStage =
PublicRenderGraphFrameDataProbeState
.ObservedStage;
ObservedRendererIndex =
PublicRenderGraphFrameDataProbeState
.ObservedRendererIndex;
}
}
public sealed class ManagedPublicRenderGraphSharedFrameDataRuntimeSelectionProbe
: MonoBehaviour
{
public bool ObservedWriterVisited;
public bool ObservedReaderVisited;
public bool ObservedReaderSawWriterItem;
public bool ObservedSameFrameData;
public bool ObservedSameRenderingData;
public int ObservedValue;
public int ObservedReaderOrder;
public void Start()
{
PublicRenderGraphSharedFrameDataProbeState.Reset();
GraphicsSettings.renderPipelineAsset =
ProbeScriptableObjectFactory
.Create<ManagedPublicRenderGraphSharedFrameDataProbeAsset>();
}
public void Update()
{
ObservedWriterVisited =
PublicRenderGraphSharedFrameDataProbeState
.WriterVisited;
ObservedReaderVisited =
PublicRenderGraphSharedFrameDataProbeState
.ReaderVisited;
ObservedReaderSawWriterItem =
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedWriterItem;
ObservedSameFrameData =
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedSameFrameData;
ObservedSameRenderingData =
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedSameRenderingData;
ObservedValue =
PublicRenderGraphSharedFrameDataProbeState
.ReaderObservedValue;
ObservedReaderOrder =
PublicRenderGraphSharedFrameDataProbeState
.ReaderOrder;
}
}
}