rendering: formalize legacy shader pass fallback

This commit is contained in:
2026-04-06 18:24:10 +08:00
parent 97e986b52c
commit 7acc397714
5 changed files with 136 additions and 40 deletions

View File

@@ -164,6 +164,8 @@ BuiltinDepthStylePassBase::ResolvedShaderPass BuiltinDepthStylePassBase::Resolve
return false;
}
const bool shaderHasExplicitBuiltinMetadata = ShaderHasExplicitBuiltinMetadata(*shader);
auto tryAcceptPass =
[this, shader, &resolved](const Resources::ShaderPass& shaderPass) -> bool {
BuiltinPassResourceBindingPlan bindingPlan = {};
@@ -178,19 +180,6 @@ BuiltinDepthStylePassBase::ResolvedShaderPass BuiltinDepthStylePassBase::Resolve
return true;
};
if (ownerMaterial != nullptr && !ownerMaterial->GetShaderPass().Empty()) {
const Resources::ShaderPass* explicitPass = shader->FindPass(ownerMaterial->GetShaderPass());
if (explicitPass != nullptr &&
ShaderPassMatchesBuiltinPass(*explicitPass, m_passType) &&
::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(
*shader,
explicitPass->name,
backend) &&
tryAcceptPass(*explicitPass)) {
return true;
}
}
for (const Resources::ShaderPass& shaderPass : shader->GetPasses()) {
if (!ShaderPassMatchesBuiltinPass(shaderPass, m_passType) ||
!::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(*shader, shaderPass.name, backend)) {
@@ -202,6 +191,20 @@ BuiltinDepthStylePassBase::ResolvedShaderPass BuiltinDepthStylePassBase::Resolve
}
}
if (!shaderHasExplicitBuiltinMetadata &&
ownerMaterial != nullptr &&
!ownerMaterial->GetShaderPass().Empty()) {
const Resources::ShaderPass* explicitPass = shader->FindPass(ownerMaterial->GetShaderPass());
if (explicitPass != nullptr &&
::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(
*shader,
explicitPass->name,
backend) &&
tryAcceptPass(*explicitPass)) {
return true;
}
}
return false;
};

View File

@@ -28,7 +28,18 @@ const Resources::ShaderPass* FindCompatibleSurfacePass(
const Resources::Material* material,
BuiltinMaterialPass pass,
Resources::ShaderBackend backend) {
if (material != nullptr && !material->GetShaderPass().Empty()) {
const bool shaderHasExplicitBuiltinMetadata = ShaderHasExplicitBuiltinMetadata(shader);
for (const Resources::ShaderPass& shaderPass : shader.GetPasses()) {
if (ShaderPassMatchesBuiltinPass(shaderPass, pass) &&
::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(shader, shaderPass.name, backend)) {
return &shaderPass;
}
}
if (!shaderHasExplicitBuiltinMetadata &&
material != nullptr &&
!material->GetShaderPass().Empty()) {
const Resources::ShaderPass* explicitPass = shader.FindPass(material->GetShaderPass());
if (explicitPass != nullptr &&
::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(shader, explicitPass->name, backend)) {
@@ -36,11 +47,8 @@ const Resources::ShaderPass* FindCompatibleSurfacePass(
}
}
for (const Resources::ShaderPass& shaderPass : shader.GetPasses()) {
if (ShaderPassMatchesBuiltinPass(shaderPass, pass) &&
::XCEngine::Rendering::Detail::ShaderPassHasGraphicsVariants(shader, shaderPass.name, backend)) {
return &shaderPass;
}
if (shaderHasExplicitBuiltinMetadata) {
return nullptr;
}
if (pass != BuiltinMaterialPass::ForwardLit) {