resources: formalize internal shader ir

This commit is contained in:
2026-04-07 11:31:13 +08:00
parent 1c87650fb3
commit 864438c508
11 changed files with 431 additions and 259 deletions

View File

@@ -433,10 +433,10 @@ bool TryParseUnityStyleBlendDirective(
}
void SetOrReplaceAuthoringTag(
std::vector<AuthoringTagEntry>& tags,
std::vector<ShaderTagIR>& tags,
const Containers::String& name,
const Containers::String& value) {
for (AuthoringTagEntry& tag : tags) {
for (ShaderTagIR& tag : tags) {
if (tag.name == name) {
tag.value = value;
return;
@@ -926,7 +926,7 @@ bool TryTokenizeQuotedArguments(const std::string& line, std::vector<std::string
bool TryParseInlineTagAssignments(
const std::string& line,
std::vector<AuthoringTagEntry>& outTags) {
std::vector<ShaderTagIR>& outTags) {
const size_t openBrace = line.find('{');
const size_t closeBrace = line.rfind('}');
if (openBrace == std::string::npos ||
@@ -1117,7 +1117,7 @@ bool TryParseAuthoringResourceLine(
bool ParseLegacyBackendSplitShaderAuthoring(
const Containers::String& path,
const std::string& sourceText,
AuthoringShaderDesc& outDesc,
ShaderIR& outDesc,
Containers::String* outError) {
(void)path;
outDesc = {};
@@ -1147,8 +1147,8 @@ bool ParseLegacyBackendSplitShaderAuthoring(
std::vector<BlockKind> blockStack;
BlockKind pendingBlock = BlockKind::None;
AuthoringSubShaderEntry* currentSubShader = nullptr;
AuthoringPassEntry* currentPass = nullptr;
ShaderSubShaderIR* currentSubShader = nullptr;
ShaderPassIR* currentPass = nullptr;
bool inProgram = false;
auto currentBlock = [&blockStack]() -> BlockKind {
@@ -1183,7 +1183,7 @@ bool ParseLegacyBackendSplitShaderAuthoring(
continue;
}
if (pragmaTokens.size() >= 6u && pragmaTokens[1] == "backend") {
AuthoringBackendVariantEntry backendVariant = {};
ShaderBackendVariantIR backendVariant = {};
if (!TryParseShaderBackend(pragmaTokens[2].c_str(), backendVariant.backend)) {
return fail("invalid backend pragma backend name", humanLine);
}
@@ -1310,7 +1310,7 @@ bool ParseLegacyBackendSplitShaderAuthoring(
}
if (StartsWithKeyword(line, "Tags")) {
std::vector<AuthoringTagEntry> parsedTags;
std::vector<ShaderTagIR> parsedTags;
if (!TryParseInlineTagAssignments(line, parsedTags)) {
return fail("Tags block must use inline key/value pairs", humanLine);
}
@@ -1375,12 +1375,12 @@ bool ParseLegacyBackendSplitShaderAuthoring(
return fail("shader does not declare any SubShader blocks", 0);
}
for (const AuthoringSubShaderEntry& subShader : outDesc.subShaders) {
for (const ShaderSubShaderIR& subShader : outDesc.subShaders) {
if (subShader.passes.empty()) {
continue;
}
for (const AuthoringPassEntry& pass : subShader.passes) {
for (const ShaderPassIR& pass : subShader.passes) {
if (pass.name.Empty()) {
return fail("a Pass is missing a Name directive", 0);
}
@@ -1396,7 +1396,7 @@ bool ParseLegacyBackendSplitShaderAuthoring(
bool ParseUnityStyleSingleSourceShaderAuthoring(
const Containers::String& path,
const std::string& sourceText,
AuthoringShaderDesc& outDesc,
ShaderIR& outDesc,
Containers::String* outError) {
(void)path;
outDesc = {};
@@ -1435,8 +1435,8 @@ bool ParseUnityStyleSingleSourceShaderAuthoring(
size_t nextExtractedBlock = 0;
std::vector<BlockKind> blockStack;
BlockKind pendingBlock = BlockKind::None;
AuthoringSubShaderEntry* currentSubShader = nullptr;
AuthoringPassEntry* currentPass = nullptr;
ShaderSubShaderIR* currentSubShader = nullptr;
ShaderPassIR* currentPass = nullptr;
bool inProgramBlock = false;
bool inSharedIncludeBlock = false;
@@ -1611,7 +1611,7 @@ bool ParseUnityStyleSingleSourceShaderAuthoring(
}
if (StartsWithKeyword(line, "Tags")) {
std::vector<AuthoringTagEntry> parsedTags;
std::vector<ShaderTagIR> parsedTags;
if (!TryParseInlineTagAssignments(line, parsedTags)) {
return fail("Tags block must use inline key/value pairs", humanLine);
}
@@ -1886,12 +1886,12 @@ bool ParseUnityStyleSingleSourceShaderAuthoring(
return fail("shader does not declare any SubShader blocks", 0);
}
for (AuthoringSubShaderEntry& subShader : outDesc.subShaders) {
for (ShaderSubShaderIR& subShader : outDesc.subShaders) {
if (subShader.passes.empty()) {
continue;
}
for (AuthoringPassEntry& pass : subShader.passes) {
for (ShaderPassIR& pass : subShader.passes) {
if (pass.name.Empty()) {
return fail("a Pass is missing a Name directive", 0);
}