2.3 KiB
2.3 KiB
TryBuildBuiltinPassResourceBindingPlan
命名空间: XCEngine::Rendering
类型: function
头文件: XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h
签名
bool TryBuildBuiltinPassResourceBindingPlan(
const Containers::Array<Resources::ShaderResourceBindingDesc>& bindings,
BuiltinPassResourceBindingPlan& outPlan,
Containers::String* outError = nullptr);
作用
把 shader 显式声明的资源绑定列表解析成 builtin pipeline 可直接消费的统一 binding plan。
当前实现行为
- 先把
outPlan重置为空。 - 如果
bindings.Empty(),直接返回true,保留空 plan。 - 逐条绑定执行:
- 通过 ResolveBuiltinPassResourceSemantic 解析 builtin 语义
- 通过 IsBuiltinPassResourceTypeCompatible 校验语义与资源类型
- 拒绝同一 builtin 语义重复出现
- 拒绝同一
set/binding对重复出现 - 回填
bindings、usesConstantBuffers、usesTextures、usesSamplers - 更新
perObject、material、lighting、shadowReceiver、纹理与采样器槽位
- 最终计算:
firstDescriptorSet = 最小 setdescriptorSetCount = 最大 set - 最小 set + 1
失败条件
当前会返回 false,并在 outError 可用时写入错误字符串:
- 解析出
Unknown语义 - 语义与 shader 资源类型不兼容
- 同一 builtin 语义出现多次
- 同一
set/binding对出现多次
当前边界
- 它只解析调用方传入的显式
bindings列表,不再负责生成 legacy fallback 绑定描述。 - 这里还不会检查“是否缺少
PerObject”或“同一 set 是否混用 sampler / 非 sampler”;这些更靠后的布局规则属于BuiltinForwardPipeline/BuiltinObjectIdPass的后续阶段。
测试覆盖
tests/Rendering/unit/test_builtin_forward_pipeline.cpp 当前验证了:
- 显式
ForwardLit/Unlitshader 资源声明能正确落成 plan - 显式 object-id / depth-style 资源声明也能正确落成 plan
- 语义重复、
set/binding重复和语义/类型不兼容时会返回失败