Formalize builtin shader resource contracts
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user