Align managed raster RenderGraph authoring with URP

This commit is contained in:
2026-04-26 23:32:09 +08:00
parent 09b1289338
commit 3b38d65ab8
13 changed files with 430 additions and 123 deletions

View File

@@ -540,6 +540,12 @@ namespace XCEngine
ulong rasterPassHandle,
ref Rendering.FinalColorSettings settings);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderContext_SetRasterPassManagedRenderFuncExecution(
ulong nativeHandle,
ulong rasterPassHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderContext_CommitRasterPass(

View File

@@ -164,9 +164,9 @@ namespace XCEngine.Rendering
name));
}
// SRP v1 wrapper over managed fullscreen raster requests. Commit only
// succeeds on fullscreen sequence stages and the execution kinds remain
// limited to the built-in fullscreen pass family.
// Public RenderGraph raster authoring entry point. Built-in fullscreen
// kernels are internal URP implementation details, not public context
// shortcuts.
public RenderGraphRasterPassBuilder AddRasterPass(
string passName)
{

View File

@@ -9,12 +9,24 @@ namespace XCEngine.Rendering
None = 0,
ColorScaleFullscreen = 1,
ShaderVectorFullscreen = 2,
FinalColorFullscreen = 3
FinalColorFullscreen = 3,
ManagedRenderFunc = 4
}
// Managed SRP v1 raster recording is intentionally narrow: this builder
// only describes fullscreen raster passes that map onto the built-in
// ColorScale / ShaderVector / FinalColor executions.
public sealed class RenderGraphRasterContext
{
internal RenderGraphRasterContext(
CommandBuffer commandBuffer)
{
cmd = commandBuffer ?? new CommandBuffer();
}
public CommandBuffer cmd { get; private set; }
}
// Public raster pass authoring follows the RenderGraph shape: declare
// resources, then provide a render func. Built-in fullscreen kernels are
// kept as internal execution details for URP.
public sealed class RenderGraphRasterPassBuilder
{
private struct TextureBindingRequest
@@ -40,6 +52,7 @@ namespace XCEngine.Rendering
private string m_shaderPath = string.Empty;
private string m_shaderPassName = string.Empty;
private FinalColorSettings m_finalColorSettings;
private Action<RenderGraphRasterContext> m_renderFunc;
private RenderGraphRasterPassExecutionKind m_executionKind;
private bool m_finalized;
@@ -70,19 +83,6 @@ namespace XCEngine.Rendering
return this;
}
public RenderGraphRasterPassBuilder
SetFinalColorFullscreenExecution(
FinalColorSettings settings)
{
m_executionKind =
RenderGraphRasterPassExecutionKind
.FinalColorFullscreen;
m_finalColorSettings = settings;
m_shaderPath = string.Empty;
m_shaderPassName = string.Empty;
return this;
}
public RenderGraphRasterPassBuilder UseTexture(
RenderGraphTextureHandle texture)
{
@@ -150,7 +150,37 @@ namespace XCEngine.Rendering
return this;
}
public RenderGraphRasterPassBuilder
public RenderGraphRasterPassBuilder SetRenderFunc(
Action<RenderGraphRasterContext> renderFunc)
{
if (renderFunc == null)
{
throw new ArgumentNullException(nameof(renderFunc));
}
m_executionKind =
RenderGraphRasterPassExecutionKind.ManagedRenderFunc;
m_renderFunc = renderFunc;
m_shaderPath = string.Empty;
m_shaderPassName = string.Empty;
return this;
}
internal RenderGraphRasterPassBuilder
SetFinalColorFullscreenExecution(
FinalColorSettings settings)
{
m_executionKind =
RenderGraphRasterPassExecutionKind
.FinalColorFullscreen;
m_finalColorSettings = settings;
m_renderFunc = null;
m_shaderPath = string.Empty;
m_shaderPassName = string.Empty;
return this;
}
internal RenderGraphRasterPassBuilder
SetColorScaleFullscreenExecution(
Vector4 colorScale)
{
@@ -158,12 +188,13 @@ namespace XCEngine.Rendering
RenderGraphRasterPassExecutionKind
.ColorScaleFullscreen;
m_vectorPayload = colorScale;
m_renderFunc = null;
m_shaderPath = string.Empty;
m_shaderPassName = string.Empty;
return this;
}
public RenderGraphRasterPassBuilder
internal RenderGraphRasterPassBuilder
SetShaderVectorFullscreenExecution(
string shaderPath,
Vector4 vectorPayload,
@@ -180,6 +211,7 @@ namespace XCEngine.Rendering
RenderGraphRasterPassExecutionKind
.ShaderVectorFullscreen;
m_vectorPayload = vectorPayload;
m_renderFunc = null;
m_shaderPath = shaderPath;
m_shaderPassName = shaderPassName ?? string.Empty;
return this;
@@ -187,11 +219,9 @@ namespace XCEngine.Rendering
public bool Commit()
{
// Native bridge rejects raster pass recording outside the
// fullscreen sequence stages.
if (m_finalized ||
!HasExecutionConfigured() ||
!HasAnyColorAttachment())
!HasRequiredAttachments())
{
return false;
}
@@ -341,6 +371,20 @@ namespace XCEngine.Rendering
nativePassHandle,
ref m_finalColorSettings);
break;
case RenderGraphRasterPassExecutionKind
.ManagedRenderFunc:
// Managed command buffers are not bridged into native
// graph execution yet, so the render func is invoked
// during recording while native records the declared IO.
m_renderFunc(
new RenderGraphRasterContext(
new CommandBuffer(m_passName)));
configuredExecution =
InternalCalls
.Rendering_ScriptableRenderContext_SetRasterPassManagedRenderFuncExecution(
m_context.nativeHandle,
nativePassHandle);
break;
default:
configuredExecution = false;
break;
@@ -359,6 +403,18 @@ namespace XCEngine.Rendering
RenderGraphRasterPassExecutionKind.None;
}
private bool HasRequiredAttachments()
{
if (m_executionKind ==
RenderGraphRasterPassExecutionKind.ManagedRenderFunc)
{
return HasAnyColorAttachment() ||
m_depthAttachment.isValid;
}
return HasAnyColorAttachment();
}
private void AddReadTexture(
RenderGraphTextureHandle texture,
bool isDepth)