SkSL::Program: Maintain a separate list of shared program elements
Change program iteration so that default iteration (over owned & shared
elements) only permits const access. Add a separate non-const iterator
that only visits owned elements.
Initially, nothing is being placed in the shared list. Follow-up CLs
will move builtin variable declarations, builtin functions, etc.
Bug: skia:10905
Change-Id: I9a5b11170117bad3ff6a43aab780c1189904417c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/330477
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLMetalCodeGenerator.cpp b/src/sksl/SkSLMetalCodeGenerator.cpp
index c7f6abd..ca16032 100644
--- a/src/sksl/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/SkSLMetalCodeGenerator.cpp
@@ -965,7 +965,7 @@
this->write(", constant Uniforms& _uniforms [[buffer(" +
to_string(fUniformBuffer) + ")]]");
}
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
const VarDeclaration& var = decls.declaration()->as<VarDeclaration>();
@@ -1422,7 +1422,7 @@
}
void MetalCodeGenerator::writeUniformStruct() {
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
const Variable& var = decls.declaration()->as<VarDeclaration>().var();
@@ -1455,7 +1455,7 @@
void MetalCodeGenerator::writeInputStruct() {
this->write("struct Inputs {\n");
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
const Variable& var = decls.declaration()->as<VarDeclaration>().var();
@@ -1488,7 +1488,7 @@
} else if (fProgram.fKind == Program::kFragment_Kind) {
this->write(" float4 sk_FragColor [[color(0)]];\n");
}
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e->as<GlobalVarDeclaration>();
const Variable& var = decls.declaration()->as<VarDeclaration>().var();
@@ -1522,7 +1522,7 @@
void MetalCodeGenerator::writeInterfaceBlocks() {
bool wroteInterfaceBlock = false;
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<InterfaceBlock>()) {
this->writeInterfaceBlock(e->as<InterfaceBlock>());
wroteInterfaceBlock = true;
@@ -1540,7 +1540,7 @@
for (const auto& [interfaceType, interfaceName] : fInterfaceBlockNameMap) {
visitor->VisitInterfaceBlock(*interfaceType, interfaceName);
}
- for (const auto& element : fProgram.elements()) {
+ for (const ProgramElement* element : fProgram.elements()) {
if (!element->is<GlobalVarDeclaration>()) {
continue;
}
@@ -1843,7 +1843,7 @@
auto found = fRequirements.find(&f);
if (found == fRequirements.end()) {
fRequirements[&f] = kNo_Requirements;
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
if (e->is<FunctionDefinition>()) {
const FunctionDefinition& def = e->as<FunctionDefinition>();
if (&def.declaration() == &f) {
@@ -1872,7 +1872,7 @@
this->writeGlobalStruct();
StringStream body;
fOut = &body;
- for (const auto& e : fProgram.elements()) {
+ for (const ProgramElement* e : fProgram.elements()) {
this->writeProgramElement(*e);
}
fOut = rawOut;