resources: expand legacy shader keyword variants

This commit is contained in:
2026-04-06 20:09:28 +08:00
parent 2a61f0b20a
commit 0761079b4c
2 changed files with 241 additions and 13 deletions

View File

@@ -837,10 +837,7 @@ bool ContainsSingleSourceAuthoringConstructs(const std::vector<std::string>& lin
return true;
}
if (line.rfind("#pragma target", 0) == 0 ||
line.rfind("#pragma multi_compile", 0) == 0 ||
line.rfind("#pragma shader_feature", 0) == 0 ||
line.rfind("#pragma shader_feature_local", 0) == 0) {
if (line.rfind("#pragma target", 0) == 0) {
return true;
}
}
@@ -1012,8 +1009,8 @@ std::vector<ShaderKeywordSet> BuildShaderKeywordVariantSets(
return keywordSets;
}
Containers::String BuildSingleSourceVariantSource(
const Containers::String& strippedCombinedSource,
Containers::String BuildKeywordVariantSource(
const Containers::String& baseSource,
const ShaderKeywordSet& requiredKeywords) {
Containers::String variantSource;
for (const Containers::String& keyword : requiredKeywords.enabledKeywords) {
@@ -1022,11 +1019,11 @@ Containers::String BuildSingleSourceVariantSource(
variantSource += " 1\n";
}
if (!variantSource.Empty() && !strippedCombinedSource.Empty()) {
if (!variantSource.Empty() && !baseSource.Empty()) {
variantSource += '\n';
}
variantSource += strippedCombinedSource;
variantSource += baseSource;
return variantSource;
}
@@ -1549,6 +1546,19 @@ bool ParseLegacyBackendSplitShaderAuthoring(
}
currentPass->backendVariants.push_back(std::move(backendVariant));
continue;
}
if (pragmaTokens.size() >= 2u &&
(pragmaTokens[1] == "multi_compile" ||
pragmaTokens[1] == "shader_feature" ||
pragmaTokens[1] == "shader_feature_local")) {
ShaderKeywordDeclaration declaration = {};
if (!TryParseShaderKeywordDeclarationPragma(pragmaTokens, declaration)) {
return fail("keyword pragma must declare at least one option", humanLine);
}
currentPass->keywordDeclarations.PushBack(declaration);
continue;
}
continue;
}
@@ -2074,7 +2084,10 @@ LoadResult BuildShaderFromAuthoringDesc(
}
if (!pass.backendVariants.empty()) {
const std::vector<ShaderKeywordSet> keywordSets =
BuildShaderKeywordVariantSets(pass.keywordDeclarations);
for (const AuthoringBackendVariantEntry& backendVariant : pass.backendVariants) {
Containers::String vertexSourceCode;
ShaderStageVariant vertexVariant = {};
vertexVariant.stage = ShaderType::Vertex;
vertexVariant.backend = backendVariant.backend;
@@ -2089,11 +2102,11 @@ LoadResult BuildShaderFromAuthoringDesc(
const Containers::String resolvedVertexPath =
ResolveShaderDependencyPath(backendVariant.vertexSourcePath, path);
if (!ReadTextFile(resolvedVertexPath, vertexVariant.sourceCode)) {
if (!ReadTextFile(resolvedVertexPath, vertexSourceCode)) {
return LoadResult("Failed to read shader authoring vertex source: " + resolvedVertexPath);
}
shader->AddPassVariant(pass.name, vertexVariant);
Containers::String fragmentSourceCode;
ShaderStageVariant fragmentVariant = {};
fragmentVariant.stage = ShaderType::Fragment;
fragmentVariant.backend = backendVariant.backend;
@@ -2108,10 +2121,19 @@ LoadResult BuildShaderFromAuthoringDesc(
const Containers::String resolvedFragmentPath =
ResolveShaderDependencyPath(backendVariant.fragmentSourcePath, path);
if (!ReadTextFile(resolvedFragmentPath, fragmentVariant.sourceCode)) {
if (!ReadTextFile(resolvedFragmentPath, fragmentSourceCode)) {
return LoadResult("Failed to read shader authoring fragment source: " + resolvedFragmentPath);
}
shader->AddPassVariant(pass.name, fragmentVariant);
for (const ShaderKeywordSet& keywordSet : keywordSets) {
vertexVariant.requiredKeywords = keywordSet;
vertexVariant.sourceCode = BuildKeywordVariantSource(vertexSourceCode, keywordSet);
shader->AddPassVariant(pass.name, vertexVariant);
fragmentVariant.requiredKeywords = keywordSet;
fragmentVariant.sourceCode = BuildKeywordVariantSource(fragmentSourceCode, keywordSet);
shader->AddPassVariant(pass.name, fragmentVariant);
}
}
} else if (!pass.programSource.Empty()) {
Containers::String combinedSource;
@@ -2126,7 +2148,7 @@ LoadResult BuildShaderFromAuthoringDesc(
for (const ShaderKeywordSet& keywordSet : keywordSets) {
const Containers::String variantSource =
BuildSingleSourceVariantSource(strippedCombinedSource, keywordSet);
BuildKeywordVariantSource(strippedCombinedSource, keywordSet);
ShaderStageVariant vertexVariant = {};
vertexVariant.stage = ShaderType::Vertex;