Files
XCEngine/managed/GameScripts/RenderPipelineApiProbe.cs

363 lines
13 KiB
C#
Raw Normal View History

using XCEngine;
namespace Gameplay
{
internal static class BuiltinShaderPaths
{
public const string ColorScalePostProcess =
"builtin://shaders/color-scale-post-process";
}
public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset
{
}
public sealed class RenderPipelineApiProbeAsset : ScriptableRenderPipelineAsset
{
}
public sealed class ManagedRenderPipelineProbeAsset : ScriptableRenderPipelineAsset
{
public static int CreatePipelineCallCount;
protected override ScriptableRenderPipeline CreatePipeline()
{
CreatePipelineCallCount++;
return new ManagedRenderPipelineProbe();
}
}
public sealed class ManagedPostProcessRenderPipelineProbeAsset : ScriptableRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
{
return new ManagedPostProcessRenderPipelineProbe();
}
}
public sealed class ManagedForwardRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
{
public static int CreatePipelineCallCount;
public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f);
protected override ScriptableRenderPipeline CreatePipeline()
{
CreatePipelineCallCount++;
return new ManagedForwardRenderPipelineProbe(
postProcessScale);
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
context.ClearFullscreenStage(CameraFrameStage.PostProcess);
context.RequestFullscreenStage(
CameraFrameStage.PostProcess,
CameraFrameColorSource.MainSceneColor,
false);
}
}
public sealed class ManagedPlannedFullscreenRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
{
return new ManagedPlannedFullscreenRenderPipelineProbe();
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
context.ClearFullscreenStage(CameraFrameStage.PostProcess);
context.ClearFullscreenStage(CameraFrameStage.FinalOutput);
context.RequestFullscreenStage(
CameraFrameStage.PostProcess,
CameraFrameColorSource.MainSceneColor,
true);
context.RequestFullscreenStage(
CameraFrameStage.FinalOutput,
CameraFrameColorSource.PostProcessColor);
}
}
public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
{
return new ManagedRenderPipelineProbe();
}
protected override void ConfigureCameraRenderRequest(
ScriptableRenderPipelineCameraRequestContext context)
{
if (context != null && context.hasDirectionalShadow)
{
context.ClearDirectionalShadow();
}
}
}
public sealed class ManagedFinalColorRenderPipelineProbeAsset
: ScriptableRenderPipelineAsset
{
protected override ScriptableRenderPipeline CreatePipeline()
{
return new ManagedRenderPipelineProbe();
}
protected override FinalColorSettings GetDefaultFinalColorSettings()
{
FinalColorSettings settings = FinalColorSettings.CreateDefault();
settings.outputTransferMode = FinalColorOutputTransferMode.LinearToSRGB;
settings.exposureMode = FinalColorExposureMode.Fixed;
settings.exposureValue = 1.75f;
settings.toneMappingMode = FinalColorToneMappingMode.ACES;
settings.finalColorScale = new Vector4(0.90f, 1.10f, 1.20f, 1.0f);
return settings;
}
}
public sealed class ManagedRenderPipelineProbe : ScriptableRenderPipeline
{
public static int SupportsStageCallCount;
public static int RecordStageCallCount;
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
SupportsStageCallCount++;
return stage == CameraFrameStage.MainScene;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
RecordStageCallCount++;
return context != null &&
context.stage == CameraFrameStage.MainScene &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.BeforeOpaque) &&
context.RecordScenePhase(ScenePhase.Opaque) &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.AfterOpaque) &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.BeforeSkybox) &&
context.RecordScenePhase(ScenePhase.Skybox) &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.AfterSkybox) &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.BeforeTransparent) &&
context.RecordScenePhase(ScenePhase.Transparent) &&
context.RecordSceneInjectionPoint(
SceneRenderInjectionPoint.AfterTransparent);
}
}
public sealed class ManagedPostProcessRenderPipelineProbe : ScriptableRenderPipeline
{
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return stage == CameraFrameStage.PostProcess;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return context != null &&
context.stage == CameraFrameStage.PostProcess &&
context.RecordFullscreenPass(
FullscreenPassDescriptor.CreateShaderVector(
BuiltinShaderPaths.ColorScalePostProcess,
new Vector4(1.10f, 0.95f, 0.90f, 1.0f),
"ColorScale")) &&
context.RecordFullscreenPass(
FullscreenPassDescriptor.CreateShaderVector(
BuiltinShaderPaths.ColorScalePostProcess,
new Vector4(0.95f, 1.05f, 1.10f, 1.0f),
"ColorScale"));
}
}
public sealed class ManagedForwardRenderPipelineProbe
: ScriptableRenderPipeline
{
public static int SupportsMainSceneCallCount;
public static int SupportsPostProcessCallCount;
public static int RecordMainSceneCallCount;
public static int RecordSceneCallCount;
public static int RecordPostProcessCallCount;
public static Vector4 LastPostProcessScale;
private readonly Vector4 m_postProcessScale;
public ManagedForwardRenderPipelineProbe(
Vector4 postProcessScale)
{
m_postProcessScale = postProcessScale;
}
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
if (stage == CameraFrameStage.MainScene)
{
SupportsMainSceneCallCount++;
return true;
}
if (stage == CameraFrameStage.PostProcess)
{
SupportsPostProcessCallCount++;
return true;
}
return false;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
if (context == null)
{
return false;
}
if (context.stage == CameraFrameStage.MainScene)
{
RecordMainSceneCallCount++;
bool recorded = context.RecordScene();
if (recorded)
{
RecordSceneCallCount++;
}
return recorded;
}
if (context.stage == CameraFrameStage.PostProcess)
{
RecordPostProcessCallCount++;
LastPostProcessScale = m_postProcessScale;
return context.RecordFullscreenPass(
FullscreenPassDescriptor.CreateColorScale(
m_postProcessScale));
}
return false;
}
}
public sealed class ManagedPlannedFullscreenRenderPipelineProbe
: ScriptableRenderPipeline
{
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return stage == CameraFrameStage.PostProcess ||
stage == CameraFrameStage.FinalOutput;
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return context != null &&
(context.stage == CameraFrameStage.PostProcess ||
context.stage == CameraFrameStage.FinalOutput) &&
context.RecordFullscreenPass(
FullscreenPassDescriptor.CreateColorScale(
new Vector4(1.05f, 1.0f, 0.95f, 1.0f)));
}
}
public sealed class RenderPipelineApiProbe : MonoBehaviour
{
public bool InitialAssetWasNull;
public bool SelectionRoundTripSucceeded;
public bool SelectionReferencePreserved;
public string SelectedPipelineAssetTypeName = string.Empty;
public void Start()
{
InitialAssetWasNull = GraphicsSettings.renderPipelineAsset == null;
RenderPipelineApiProbeAsset selectedAssetInstance =
new RenderPipelineApiProbeAsset();
GraphicsSettings.renderPipelineAsset = selectedAssetInstance;
ScriptableRenderPipelineAsset selectedAsset =
GraphicsSettings.renderPipelineAsset;
SelectionRoundTripSucceeded =
selectedAsset is RenderPipelineApiProbeAsset;
SelectionReferencePreserved =
object.ReferenceEquals(
selectedAsset,
selectedAssetInstance);
SelectedPipelineAssetTypeName = selectedAsset != null
? selectedAsset.GetType().FullName ?? string.Empty
: string.Empty;
}
}
public sealed class ManagedRenderPipelineRuntimeSelectionProbe : MonoBehaviour
{
public void Start()
{
ManagedRenderPipelineProbeAsset.CreatePipelineCallCount = 0;
ManagedRenderPipelineProbe.SupportsStageCallCount = 0;
ManagedRenderPipelineProbe.RecordStageCallCount = 0;
GraphicsSettings.renderPipelineAsset =
new ManagedRenderPipelineProbeAsset();
}
}
public sealed class ManagedForwardRenderPipelineRuntimeSelectionProbe
: MonoBehaviour
{
public int ObservedCreatePipelineCallCount;
public int ObservedSupportsMainSceneCallCount;
public int ObservedSupportsPostProcessCallCount;
public int ObservedRecordMainSceneCallCount;
public int ObservedRecordSceneCallCount;
public int ObservedRecordPostProcessCallCount;
public Vector4 ObservedPostProcessScale;
public void Start()
{
ManagedForwardRenderPipelineProbeAsset.CreatePipelineCallCount = 0;
ManagedForwardRenderPipelineProbe.SupportsMainSceneCallCount = 0;
ManagedForwardRenderPipelineProbe.SupportsPostProcessCallCount = 0;
ManagedForwardRenderPipelineProbe.RecordMainSceneCallCount = 0;
ManagedForwardRenderPipelineProbe.RecordSceneCallCount = 0;
ManagedForwardRenderPipelineProbe.RecordPostProcessCallCount = 0;
ManagedForwardRenderPipelineProbe.LastPostProcessScale =
new Vector4(0.0f, 0.0f, 0.0f, 0.0f);
GraphicsSettings.renderPipelineAsset =
new ManagedForwardRenderPipelineProbeAsset
{
postProcessScale = new Vector4(1.11f, 0.97f, 0.93f, 1.0f)
};
}
public void Update()
{
ObservedCreatePipelineCallCount =
ManagedForwardRenderPipelineProbeAsset.CreatePipelineCallCount;
ObservedSupportsMainSceneCallCount =
ManagedForwardRenderPipelineProbe.SupportsMainSceneCallCount;
ObservedSupportsPostProcessCallCount =
ManagedForwardRenderPipelineProbe.SupportsPostProcessCallCount;
ObservedRecordMainSceneCallCount =
ManagedForwardRenderPipelineProbe.RecordMainSceneCallCount;
ObservedRecordSceneCallCount =
ManagedForwardRenderPipelineProbe.RecordSceneCallCount;
ObservedRecordPostProcessCallCount =
ManagedForwardRenderPipelineProbe.RecordPostProcessCallCount;
ObservedPostProcessScale =
ManagedForwardRenderPipelineProbe.LastPostProcessScale;
}
}
}