Tighten URP pass queue snapshot ownership

This commit is contained in:
2026-04-27 15:21:57 +08:00
parent c0b829cd6a
commit 66d968c3ce
22 changed files with 849 additions and 51 deletions

View File

@@ -67,6 +67,10 @@ Unity 兼容的公开命名、对象所有权和扩展点。
resource versions 必须保持一致。
- 修改 renderer-index 行为时,要一起更新 `CameraRenderRequest.rendererIndex`、stage support contexts、
`RendererRecordingContext`、managed probes 和 Mono bridge calls。
- 修改 URP stage planning、stage support 或 recording 行为时,要保持 `CameraFramePlan.framePlanId`
`RenderPipelineStageSupportContext.framePlanId``RenderPipelineStageRenderGraphContext.framePlanId`
`ScriptableRenderPipelinePlanningContext.framePlanId``ScriptableRenderContext.framePlanId` 同步。
`framePlanId` 是 per-camera-frame plan 的托管快照键,不是 renderer 或 camera 的长期身份。
- 新增 public managed rendering type 时,将它加入 `managed/CMakeLists.txt`,并在对应 managed probe
里覆盖 API presence。
@@ -213,6 +217,12 @@ package。
- URP stage planning 以 `ScriptableRenderer` 的 active pass queue 为最终事实源。`ConfigureCameraFramePlan`
仍是兼容和高级策略 hook但它不能单独声明 shadow、depth、post 或 final-output stage没有被 pass queue
覆盖到的 side/fullscreen stage 必须在最终 plan 中清掉。
- `ConfigurePassQueueCameraFramePlanInstance` 必须在 planning 阶段为当前 renderer 和 `framePlanId`
生成一次 per-stage pass queue 快照,并用该快照派生 stage manifest。`SupportsStageRenderGraph`
`RecordStageRenderGraph``framePlanId != 0` 时必须消费这个快照,不得重新运行
feature `SetupRenderPasses`、feature `AddRenderPasses` 或 renderer-owned `AddRenderPasses` 来重建队列。
找不到匹配 `framePlanId` 和 renderer index 的快照时必须返回不支持或 record 失败,让上层暴露错误;
不要退回 legacy queue rebuild 或 built-in fallback。
- `RendererBlock` 将 pass events 映射到 camera stagesshadow caster、depth prepass、main opaque、main
skybox、main transparent、post process 和 final output。
- `UniversalRenderer` 拥有具体 blocks
@@ -329,8 +339,9 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
RenderGraph。
- URP 现在已有 renderer data、renderer features、renderer pass queueing、renderer blocks、renderer-index
resolution 和 per-stage recording。
- URP stage planning 已收口到 renderer active pass queue 派生的 stage manifest关闭了 feature planning hook
与实际 pass queue 分离的重复事实源。
- URP stage planning 已收口到 renderer active pass queue 派生的 per-`framePlanId` 快照和 stage manifest。
Stage support 和 stage recording 现在消费 planning 阶段保存的快照,关闭了 feature planning hook、
support probe 和 recording 各自重建 pass queue 的重复事实源。
- Public managed RenderGraph raster authoring 已存在internal fullscreen kernels 仍是 URP implementation
details。
- Public `ScriptableRenderPass.RecordRenderGraph(RenderGraph, ContextContainer)` 通过 `RenderingData`

View File

@@ -4,6 +4,7 @@
#include <XCEngine/Rendering/Execution/CameraFrameStage.h>
#include <XCEngine/Rendering/Planning/CameraRenderRequest.h>
#include <cstdint>
#include <memory>
namespace XCEngine {
@@ -33,6 +34,7 @@ struct CameraFramePlan {
static RenderSurface BuildCameraDepthOnlySurfaceTemplate(
const RenderSurface& surface);
uint64_t framePlanId = 0u;
CameraRenderRequest request = {};
ShadowCasterRenderRequest shadowCaster = {};
DirectionalShadowRenderPlan directionalShadow = {};

View File

@@ -15,6 +15,7 @@
#include <memory>
#include <array>
#include <cstdint>
#include <vector>
namespace XCEngine {
@@ -59,11 +60,13 @@ struct RenderPipelineStageRenderGraphContext {
bool usesGraphManagedOutputColor = false;
DirectionalShadowRenderPlan directionalShadowPlan = {};
int32_t rendererIndex = -1;
uint64_t framePlanId = 0u;
};
struct RenderPipelineStageSupportContext {
CameraFrameStage stage = CameraFrameStage::MainScene;
int32_t rendererIndex = -1;
uint64_t framePlanId = 0u;
};
class RenderPipelineBackend;