Formalize builtin shader resource contracts

This commit is contained in:
2026-04-08 04:44:36 +08:00
parent 6113ed92b0
commit 2c1c815072
26 changed files with 358 additions and 368 deletions

View File

@@ -51,9 +51,24 @@ inline bool TryBuildBuiltinPassResourceBindingPlan(
case BuiltinPassResourceSemantic::ShadowReceiver:
location = &outPlan.shadowReceiver;
break;
case BuiltinPassResourceSemantic::Environment:
location = &outPlan.environment;
break;
case BuiltinPassResourceSemantic::PassConstants:
location = &outPlan.passConstants;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
location = &outPlan.baseColorTexture;
break;
case BuiltinPassResourceSemantic::SourceColorTexture:
location = &outPlan.sourceColorTexture;
break;
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:
location = &outPlan.skyboxPanoramicTexture;
break;
case BuiltinPassResourceSemantic::SkyboxTexture:
location = &outPlan.skyboxTexture;
break;
case BuiltinPassResourceSemantic::LinearClampSampler:
location = &outPlan.linearClampSampler;
break;
@@ -131,7 +146,7 @@ inline void AppendBuiltinPassResourceBinding(
bindings.PushBack(desc);
}
inline bool TryBuildImplicitBuiltinPassResourceBindings(
inline bool TryBuildBuiltinPassDefaultResourceBindings(
const Resources::ShaderPass& shaderPass,
Containers::Array<Resources::ShaderResourceBindingDesc>& outBindings) {
outBindings.Clear();
@@ -241,6 +256,95 @@ inline bool TryBuildImplicitBuiltinPassResourceBindings(
return true;
}
if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::Skybox)) {
AppendBuiltinPassResourceBinding(
outBindings,
"EnvironmentConstants",
Resources::ShaderResourceType::ConstantBuffer,
0u,
0u,
"Environment");
AppendBuiltinPassResourceBinding(
outBindings,
"MaterialConstants",
Resources::ShaderResourceType::ConstantBuffer,
1u,
0u,
"Material");
AppendBuiltinPassResourceBinding(
outBindings,
"SkyboxPanoramicTexture",
Resources::ShaderResourceType::Texture2D,
2u,
0u,
"SkyboxPanoramicTexture");
AppendBuiltinPassResourceBinding(
outBindings,
"SkyboxTexture",
Resources::ShaderResourceType::TextureCube,
3u,
0u,
"SkyboxTexture");
AppendBuiltinPassResourceBinding(
outBindings,
"LinearClampSampler",
Resources::ShaderResourceType::Sampler,
4u,
0u,
"LinearClampSampler");
return true;
}
if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::PostProcess)) {
AppendBuiltinPassResourceBinding(
outBindings,
"PostProcessConstants",
Resources::ShaderResourceType::ConstantBuffer,
0u,
0u,
"PassConstants");
AppendBuiltinPassResourceBinding(
outBindings,
"SourceColorTexture",
Resources::ShaderResourceType::Texture2D,
1u,
0u,
"SourceColorTexture");
AppendBuiltinPassResourceBinding(
outBindings,
"LinearClampSampler",
Resources::ShaderResourceType::Sampler,
2u,
0u,
"LinearClampSampler");
return true;
}
if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::FinalColor)) {
AppendBuiltinPassResourceBinding(
outBindings,
"FinalColorConstants",
Resources::ShaderResourceType::ConstantBuffer,
0u,
0u,
"PassConstants");
AppendBuiltinPassResourceBinding(
outBindings,
"SourceColorTexture",
Resources::ShaderResourceType::Texture2D,
1u,
0u,
"SourceColorTexture");
AppendBuiltinPassResourceBinding(
outBindings,
"LinearClampSampler",
Resources::ShaderResourceType::Sampler,
2u,
0u,
"LinearClampSampler");
return true;
}
return false;
}
@@ -248,20 +352,15 @@ inline bool TryBuildBuiltinPassResourceBindingPlan(
const Resources::ShaderPass& shaderPass,
BuiltinPassResourceBindingPlan& outPlan,
Containers::String* outError = nullptr) {
if (!shaderPass.resources.Empty()) {
return TryBuildBuiltinPassResourceBindingPlan(shaderPass.resources, outPlan, outError);
}
Containers::Array<Resources::ShaderResourceBindingDesc> implicitBindings;
if (!TryBuildImplicitBuiltinPassResourceBindings(shaderPass, implicitBindings)) {
if (shaderPass.resources.Empty()) {
if (outError != nullptr) {
*outError = "Builtin pass does not declare explicit bindings and no implicit contract is available";
*outError = "Builtin pass must declare explicit resource bindings";
}
outPlan = {};
return false;
}
return TryBuildBuiltinPassResourceBindingPlan(implicitBindings, outPlan, outError);
return TryBuildBuiltinPassResourceBindingPlan(shaderPass.resources, outPlan, outError);
}
inline RHI::DescriptorType ToBuiltinPassDescriptorType(Resources::ShaderResourceType type) {
@@ -396,10 +495,28 @@ inline bool TryBuildBuiltinPassSetLayouts(
case BuiltinPassResourceSemantic::ShadowReceiver:
setLayout.usesShadowReceiver = true;
break;
case BuiltinPassResourceSemantic::Environment:
setLayout.usesEnvironment = true;
break;
case BuiltinPassResourceSemantic::PassConstants:
setLayout.usesPassConstants = true;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
setLayout.usesTexture = true;
setLayout.usesBaseColorTexture = true;
break;
case BuiltinPassResourceSemantic::SourceColorTexture:
setLayout.usesTexture = true;
setLayout.usesSourceColorTexture = true;
break;
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:
setLayout.usesTexture = true;
setLayout.usesSkyboxPanoramicTexture = true;
break;
case BuiltinPassResourceSemantic::SkyboxTexture:
setLayout.usesTexture = true;
setLayout.usesSkyboxTexture = true;
break;
case BuiltinPassResourceSemantic::ShadowMapTexture:
setLayout.usesTexture = true;
setLayout.usesShadowMapTexture = true;