Align URP scene drawing with RenderGraph renderer lists

This commit is contained in:
2026-04-28 00:03:24 +08:00
parent 6b488d5eac
commit 03967b152d
13 changed files with 908 additions and 48 deletions

View File

@@ -437,6 +437,11 @@ namespace XCEngine
Rendering_ScriptableRenderContext_GetFramePlanId(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern string
Rendering_ScriptableRenderContext_GetPassName(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
@@ -507,6 +512,13 @@ namespace XCEngine
int textureHandle,
bool isDepth);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderContext_AddRasterPassRendererList(
ulong nativeHandle,
ulong rasterPassHandle,
int rendererListHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderContext_SetRasterPassColorAttachment(
@@ -564,6 +576,17 @@ namespace XCEngine
ulong nativeHandle,
ref Color color);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_CommandBuffer_DrawRendererList(
ulong nativeHandle,
int rendererListHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_CommandBuffer_DrawSkybox(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex(
@@ -927,6 +950,15 @@ namespace XCEngine
string shaderPassName,
ref Rendering.RenderStateBlock renderStateBlock);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderContext_CreateRendererList(
ulong nativeHandle,
ref Rendering.RendererListDesc rendererListDesc,
string overrideMaterialPath,
string shaderPassName,
ref Rendering.RenderStateBlock renderStateBlock);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount(

View File

@@ -38,6 +38,23 @@ namespace XCEngine.Rendering
ref color);
}
public bool DrawRendererList(
RendererListHandle rendererList)
{
return m_nativeHandle != 0ul &&
rendererList.isValid &&
InternalCalls.Rendering_CommandBuffer_DrawRendererList(
m_nativeHandle,
rendererList.nativeIndex);
}
public bool DrawSkybox()
{
return m_nativeHandle != 0ul &&
InternalCalls.Rendering_CommandBuffer_DrawSkybox(
m_nativeHandle);
}
private readonly ulong m_nativeHandle;
}
}

View File

@@ -0,0 +1,29 @@
namespace XCEngine.Rendering
{
public struct RendererListHandle
{
private readonly int m_indexPlusOne;
private RendererListHandle(
int indexPlusOne)
{
m_indexPlusOne = indexPlusOne;
}
public bool isValid =>
m_indexPlusOne > 0;
internal int nativeIndex =>
m_indexPlusOne > 0
? m_indexPlusOne - 1
: -1;
internal static RendererListHandle FromNativeIndex(
int nativeIndex)
{
return nativeIndex >= 0
? new RendererListHandle(nativeIndex + 1)
: default;
}
}
}

View File

@@ -28,6 +28,11 @@ namespace XCEngine.Rendering
.Rendering_ScriptableRenderContext_GetFramePlanId(
m_nativeHandle);
internal string passName =>
InternalCalls
.Rendering_ScriptableRenderContext_GetPassName(
m_nativeHandle) ?? string.Empty;
public RenderGraphTextureHandle sourceColorTexture =>
RenderGraphTextureHandle.FromNativeIndex(
InternalCalls
@@ -171,6 +176,23 @@ namespace XCEngine.Rendering
name));
}
internal RendererListHandle CreateRendererList(
RendererListDesc rendererListDesc,
DrawingSettings drawingSettings)
{
RenderStateBlock renderStateBlock =
drawingSettings.renderStateBlock;
return RendererListHandle.FromNativeIndex(
InternalCalls
.Rendering_ScriptableRenderContext_CreateRendererList(
m_nativeHandle,
ref rendererListDesc,
drawingSettings.overrideMaterialPath ??
string.Empty,
drawingSettings.shaderPassName ?? string.Empty,
ref renderStateBlock));
}
// Public RenderGraph raster authoring entry point. Built-in fullscreen
// kernels are internal URP implementation details, not public context
// shortcuts.

View File

@@ -30,5 +30,53 @@ namespace XCEngine.Rendering.RenderGraphModule
return m_context.AddRasterPass(passName);
}
public XCEngine.Rendering.RendererListHandle
CreateRendererList(
XCEngine.Rendering.RendererListDesc rendererListDesc)
{
return CreateRendererList(
rendererListDesc,
XCEngine.Rendering.DrawingSettings.CreateDefault());
}
public XCEngine.Rendering.RendererListHandle
CreateRendererList(
XCEngine.Rendering.RendererListDesc rendererListDesc,
XCEngine.Rendering.DrawingSettings drawingSettings)
{
if (m_context == null)
{
throw new InvalidOperationException(
"RenderGraph is not bound to a recording context.");
}
return m_context.CreateRendererList(
rendererListDesc,
drawingSettings);
}
internal string passName =>
m_context != null
? m_context.passName
: string.Empty;
public XCEngine.Rendering.RenderGraphTextureHandle
sourceColorTexture =>
m_context != null
? m_context.sourceColorTexture
: default;
public XCEngine.Rendering.RenderGraphTextureHandle
primaryColorTarget =>
m_context != null
? m_context.primaryColorTarget
: default;
public XCEngine.Rendering.RenderGraphTextureHandle
depthTarget =>
m_context != null
? m_context.depthTarget
: default;
}
}

View File

@@ -42,6 +42,8 @@ namespace XCEngine.Rendering
new List<RenderGraphTextureHandle>();
private readonly List<RenderGraphTextureHandle> m_readDepthTextures =
new List<RenderGraphTextureHandle>();
private readonly List<RendererListHandle> m_rendererLists =
new List<RendererListHandle>();
private readonly List<TextureBindingRequest> m_textureBindings =
new List<TextureBindingRequest>();
private readonly List<RenderGraphTextureHandle> m_colorAttachments =
@@ -123,6 +125,27 @@ namespace XCEngine.Rendering
return this;
}
public RenderGraphRasterPassBuilder UseRendererList(
RendererListHandle rendererList)
{
if (!rendererList.isValid)
{
return this;
}
for (int i = 0; i < m_rendererLists.Count; ++i)
{
if (m_rendererLists[i].nativeIndex ==
rendererList.nativeIndex)
{
return this;
}
}
m_rendererLists.Add(rendererList);
return this;
}
public RenderGraphRasterPassBuilder SetColorAttachment(
RenderGraphTextureHandle texture,
int index = 0)
@@ -309,6 +332,25 @@ namespace XCEngine.Rendering
}
}
for (int i = 0; i < m_rendererLists.Count; ++i)
{
RendererListHandle rendererList =
m_rendererLists[i];
if (!rendererList.isValid)
{
continue;
}
if (!InternalCalls
.Rendering_ScriptableRenderContext_AddRasterPassRendererList(
m_context.nativeHandle,
nativePassHandle,
rendererList.nativeIndex))
{
return false;
}
}
for (int i = 0; i < m_colorAttachments.Count; ++i)
{
RenderGraphTextureHandle colorAttachment =