refactor(srp): collapse universal pipeline wrappers

This commit is contained in:
2026-04-19 15:33:03 +08:00
parent 237a628e2a
commit dc13b56cf3
9 changed files with 127 additions and 96 deletions

View File

@@ -197,9 +197,6 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/LightingData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderClearFlags.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderEnvironmentMode.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipelineAsset.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererDrivenRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderPassEvent.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderingData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderingDataResolver.cs
@@ -211,6 +208,7 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/ScriptableRendererFeature.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/CameraRenderRequestContextExtensions.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/StageColorData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderer.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRendererData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs

View File

@@ -725,6 +725,40 @@ namespace Gameplay
}
}
public abstract class ProbeRendererPipeline
: ScriptableRenderPipeline
{
private ScriptableRenderer m_renderer;
protected abstract ScriptableRenderer CreateRenderer();
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
ScriptableRenderer renderer = GetOrCreateRenderer();
return renderer != null &&
renderer.SupportsStageRenderGraph(stage);
}
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
ScriptableRenderer renderer = GetOrCreateRenderer();
return renderer != null &&
renderer.RecordStageRenderGraph(context);
}
private ScriptableRenderer GetOrCreateRenderer()
{
if (m_renderer == null)
{
m_renderer = CreateRenderer();
}
return m_renderer;
}
}
public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset
{
}
@@ -796,16 +830,35 @@ namespace Gameplay
}
}
internal sealed class ManagedCameraRequestConfiguredRenderPipelineProbe
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{
return new ProbeSceneRenderer();
}
}
public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset
: RendererBackedRenderPipelineAsset
: ScriptableRenderPipelineAsset
{
private readonly ManagedCameraRequestConfiguredRendererData
m_rendererData =
new ManagedCameraRequestConfiguredRendererData();
protected override ScriptableRendererData GetRendererData()
protected override ScriptableRenderPipeline CreatePipeline()
{
return m_rendererData;
return new ManagedCameraRequestConfiguredRenderPipelineProbe();
}
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
if (context != null &&
context.HasDirectionalShadow())
{
context.ClearDirectionalShadow();
}
}
}
@@ -857,7 +910,7 @@ namespace Gameplay
}
public sealed class ManagedRenderPipelineProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
public static int SupportsStageCallCount;
public static int RecordStageCallCount;
@@ -883,7 +936,7 @@ namespace Gameplay
}
public sealed class ManagedPostProcessRenderPipelineProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{
@@ -894,7 +947,7 @@ namespace Gameplay
}
public sealed class ManagedUniversalRenderPipelineProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
public static int SupportsMainSceneCallCount;
public static int SupportsPostProcessCallCount;
@@ -961,7 +1014,7 @@ namespace Gameplay
}
public sealed class ManagedPlannedFullscreenRenderPipelineProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{
@@ -970,7 +1023,7 @@ namespace Gameplay
}
public sealed class ManagedRenderContextCameraDataProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{
@@ -979,7 +1032,7 @@ namespace Gameplay
}
public sealed class ManagedRenderContextStageColorDataProbe
: RendererBackedRenderPipeline
: ProbeRendererPipeline
{
protected override ScriptableRenderer CreateRenderer()
{

View File

@@ -31,6 +31,9 @@ namespace Gameplay
public bool HasRendererFeatureConfigureCameraFramePlan;
public bool HasRendererRecordingContextType;
public bool HasRendererCameraRequestContextType;
public bool HasRendererBackedRenderPipelineAssetType;
public bool HasRendererBackedRenderPipelineType;
public bool HasRendererDrivenRenderPipelineType;
public void Start()
{
@@ -154,6 +157,15 @@ namespace Gameplay
HasRendererCameraRequestContextType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererCameraRequestContext, XCEngine.RenderPipelines.Universal") != null;
HasRendererBackedRenderPipelineAssetType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipelineAsset, XCEngine.RenderPipelines.Universal") != null;
HasRendererBackedRenderPipelineType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipeline, XCEngine.RenderPipelines.Universal") != null;
HasRendererDrivenRenderPipelineType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererDrivenRenderPipeline, XCEngine.RenderPipelines.Universal") != null;
}
}
}

View File

@@ -1,42 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class RendererBackedRenderPipelineAsset
: ScriptableRenderPipelineAsset
{
protected RendererBackedRenderPipelineAsset()
{
}
protected override ScriptableRenderPipeline CreatePipeline()
{
ScriptableRendererData rendererData =
ResolveRendererData();
return rendererData != null
? new RendererDrivenRenderPipeline(rendererData)
: null;
}
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
ScriptableRendererData rendererData =
ResolveRendererData();
if (rendererData != null)
{
rendererData.ConfigureCameraRenderRequestInstance(
context);
}
}
protected abstract ScriptableRendererData GetRendererData();
private ScriptableRendererData ResolveRendererData()
{
return GetRendererData();
}
}
}

View File

@@ -1,25 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public class RendererDrivenRenderPipeline
: RendererBackedRenderPipeline
{
private readonly ScriptableRendererData m_rendererData;
public RendererDrivenRenderPipeline(
ScriptableRendererData rendererData)
{
m_rendererData = rendererData;
}
protected internal override ScriptableRenderer CreateRenderer()
{
return m_rendererData != null
? m_rendererData.CreateRendererInstance()
: null;
}
}
}

View File

@@ -53,7 +53,7 @@ namespace XCEngine.Rendering.Universal
{
}
internal bool SupportsStageRenderGraph(
public bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
RenderingData renderingData = new RenderingData(stage);
@@ -71,7 +71,7 @@ namespace XCEngine.Rendering.Universal
return false;
}
internal bool RecordStageRenderGraph(
public bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
if (context == null)

View File

@@ -3,18 +3,16 @@ using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class RendererBackedRenderPipeline
internal sealed class UniversalRenderPipeline
: ScriptableRenderPipeline
{
private readonly ScriptableRendererData m_rendererData;
private ScriptableRenderer m_renderer;
protected RendererBackedRenderPipeline()
public UniversalRenderPipeline(
ScriptableRendererData rendererData)
{
}
protected internal virtual ScriptableRenderer CreateRenderer()
{
return null;
m_rendererData = rendererData;
}
protected override bool SupportsStageRenderGraph(
@@ -33,18 +31,16 @@ namespace XCEngine.Rendering.Universal
renderer.RecordStageRenderGraph(context);
}
protected ScriptableRenderer renderer =>
GetOrCreateRenderer();
private ScriptableRenderer GetOrCreateRenderer()
{
if (m_renderer == null)
if (m_renderer == null &&
m_rendererData != null)
{
m_renderer = CreateRenderer();
m_renderer =
m_rendererData.CreateRendererInstance();
}
return m_renderer;
}
}
}

View File

@@ -4,12 +4,33 @@ using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public class UniversalRenderPipelineAsset
: RendererBackedRenderPipelineAsset
: ScriptableRenderPipelineAsset
{
public UniversalRendererData rendererData =
new UniversalRendererData();
protected override ScriptableRendererData GetRendererData()
protected override ScriptableRenderPipeline CreatePipeline()
{
ScriptableRendererData resolvedRendererData =
ResolveRendererData();
return resolvedRendererData != null
? new UniversalRenderPipeline(resolvedRendererData)
: null;
}
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveRendererData();
if (resolvedRendererData != null)
{
resolvedRendererData.ConfigureCameraRenderRequestInstance(
context);
}
}
private ScriptableRendererData ResolveRendererData()
{
if (rendererData == null)
{

View File

@@ -1174,6 +1174,9 @@ TEST_F(
bool hasRendererFeatureConfigureCameraFramePlan = false;
bool hasRendererRecordingContextType = false;
bool hasRendererCameraRequestContextType = false;
bool hasRendererBackedRenderPipelineAssetType = false;
bool hasRendererBackedRenderPipelineType = false;
bool hasRendererDrivenRenderPipelineType = false;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
@@ -1267,6 +1270,18 @@ TEST_F(
selectionScript,
"HasRendererCameraRequestContextType",
hasRendererCameraRequestContextType));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasRendererBackedRenderPipelineAssetType",
hasRendererBackedRenderPipelineAssetType));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasRendererBackedRenderPipelineType",
hasRendererBackedRenderPipelineType));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasRendererDrivenRenderPipelineType",
hasRendererDrivenRenderPipelineType));
EXPECT_FALSE(hasPublicContextRecordScene);
EXPECT_FALSE(hasPublicContextRecordOpaqueScenePhase);
@@ -1291,6 +1306,9 @@ TEST_F(
EXPECT_FALSE(hasRendererFeatureConfigureCameraFramePlan);
EXPECT_FALSE(hasRendererRecordingContextType);
EXPECT_FALSE(hasRendererCameraRequestContextType);
EXPECT_FALSE(hasRendererBackedRenderPipelineAssetType);
EXPECT_FALSE(hasRendererBackedRenderPipelineType);
EXPECT_FALSE(hasRendererDrivenRenderPipelineType);
}
TEST_F(