Use accessors to refer to the ModifiersPool.
This is a first step towards moving the ModifiersPool out of the
IRGenerator and into the Context.
Change-Id: I8000923f32a9e3cc1878a09464680884b950e513
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/404216
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 789ca5d..a61b416 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -185,7 +185,7 @@
// treat it as builtin (ie, no need to clone it into the Program).
fPrivateSymbolTable->add(
std::make_unique<Variable>(/*offset=*/-1,
- fIRGenerator->fModifiers->addToPool(Modifiers()),
+ fIRGenerator->modifiersPool().add(Modifiers()),
"sk_Caps",
fContext->fTypes.fSkCaps.get(),
/*builtin=*/false,
@@ -339,7 +339,7 @@
fModifiers.push_back(std::move(ir.fModifiers));
#else
SkASSERT(data.fData && (data.fSize != 0));
- Rehydrator rehydrator(fContext.get(), fIRGenerator->fModifiers.get(), base, this,
+ Rehydrator rehydrator(fContext.get(), fIRGenerator->fModifiers.get(), base,
data.fData, data.fSize);
LoadedModule module = { kind, rehydrator.symbolTable(), rehydrator.elements() };
fModifiers.push_back(fIRGenerator->releaseModifiers());
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index ce2edf8..67c9321 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -81,7 +81,7 @@
IRGenerator::IRGenerator(const Context* context)
: fContext(*context)
- , fModifiers(new ModifiersPool()) {}
+ , fModifiers(std::make_unique<ModifiersPool>()) {}
void IRGenerator::pushSymbolTable() {
auto childSymTable = std::make_shared<SymbolTable>(std::move(fSymbolTable), fIsBuiltinCode);
@@ -358,8 +358,8 @@
}
type = fSymbolTable->addArrayDimension(type, arraySizeValue);
}
- return std::make_unique<Variable>(offset, fModifiers->addToPool(modifiers), name, type,
- fIsBuiltinCode, storage);
+ return std::make_unique<Variable>(offset, this->modifiersPool().add(modifiers), name,
+ type, fIsBuiltinCode, storage);
}
std::unique_ptr<Statement> IRGenerator::convertVarDeclaration(std::unique_ptr<Variable> var,
@@ -489,7 +489,7 @@
!this->caps().gsInvocationsSupport()) {
modifiers.fLayout.fMaxVertices *= fInvocations;
}
- return std::make_unique<ModifiersDeclaration>(fModifiers->addToPool(modifiers));
+ return std::make_unique<ModifiersDeclaration>(this->modifiersPool().add(modifiers));
}
std::unique_ptr<Statement> IRGenerator::convertIf(const ASTNode& n) {
@@ -687,7 +687,7 @@
Modifiers invokeModifiers(invokeLayout, Modifiers::kHasSideEffects_Flag);
const FunctionDeclaration* invokeDecl = fSymbolTable->add(std::make_unique<FunctionDeclaration>(
/*offset=*/-1,
- fModifiers->addToPool(invokeModifiers),
+ this->modifiersPool().add(invokeModifiers),
"_invoke",
std::vector<const Variable*>(),
fContext.fTypes.fVoid.get(),
@@ -1056,8 +1056,8 @@
}
const Variable* var = fSymbolTable->takeOwnershipOfSymbol(
- std::make_unique<Variable>(param.fOffset, fModifiers->addToPool(m), pd.fName, type,
- fIsBuiltinCode, Variable::Storage::kParameter));
+ std::make_unique<Variable>(param.fOffset, this->modifiersPool().add(m), pd.fName,
+ type, fIsBuiltinCode, Variable::Storage::kParameter));
parameters.push_back(var);
}
@@ -1177,7 +1177,7 @@
if (match) {
if (*returnType != other->returnType()) {
FunctionDeclaration newDecl(f.fOffset,
- fModifiers->addToPool(funcData.fModifiers),
+ this->modifiersPool().add(funcData.fModifiers),
funcData.fName,
parameters,
returnType,
@@ -1224,7 +1224,7 @@
// Create a new declaration.
decl = fSymbolTable->add(
std::make_unique<FunctionDeclaration>(f.fOffset,
- fModifiers->addToPool(declModifiers),
+ this->modifiersPool().add(declModifiers),
funcData.fName,
parameters,
returnType,
@@ -1344,7 +1344,7 @@
}
const Variable* var = old->takeOwnershipOfSymbol(
std::make_unique<Variable>(intf.fOffset,
- fModifiers->addToPool(id.fModifiers),
+ this->modifiersPool().add(id.fModifiers),
id.fInstanceName.fLength ? id.fInstanceName : id.fTypeName,
type,
fIsBuiltinCode,
@@ -1415,7 +1415,7 @@
}
value = IntLiteral::Make(fContext, e.fOffset, currentValue);
++currentValue;
- auto var = std::make_unique<Variable>(e.fOffset, fModifiers->addToPool(modifiers),
+ auto var = std::make_unique<Variable>(e.fOffset, this->modifiersPool().add(modifiers),
child.getString(), type, fIsBuiltinCode,
Variable::Storage::kGlobal);
// enum variables aren't really 'declared', but we have to create a declaration to store
@@ -2121,7 +2121,7 @@
m.fFlags = Modifiers::kIn_Flag;
m.fLayout.fBuiltin = SK_INVOCATIONID_BUILTIN;
}
- auto var = std::make_unique<Variable>(/*offset=*/-1, fModifiers->addToPool(m),
+ auto var = std::make_unique<Variable>(/*offset=*/-1, this->modifiersPool().add(m),
"sk_InvocationID", fContext.fTypes.fInt.get(),
/*builtin=*/false, Variable::Storage::kGlobal);
auto decl = VarDeclaration::Make(fContext, var.get(), fContext.fTypes.fInt.get(),
@@ -2171,10 +2171,11 @@
}
}
- IRBundle result{std::move(*fProgramElements), std::move(*fSharedElements),
- this->releaseModifiers(), fSymbolTable, fInputs};
- fSymbolTable = nullptr;
- return result;
+ return IRBundle{std::move(*fProgramElements),
+ std::move(*fSharedElements),
+ this->releaseModifiers(),
+ std::move(fSymbolTable),
+ fInputs};
}
IRGenerator::IRBundle IRGenerator::convertProgram(
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index 9f2efad..0691d00 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -257,6 +257,10 @@
return fContext.fCaps;
}
+ ModifiersPool& modifiersPool() const {
+ return *fModifiers;
+ }
+
Program::Inputs fInputs;
std::unique_ptr<ASTFile> fFile;
diff --git a/src/sksl/SkSLInliner.cpp b/src/sksl/SkSLInliner.cpp
index ae92cc6..cba019a 100644
--- a/src/sksl/SkSLInliner.cpp
+++ b/src/sksl/SkSLInliner.cpp
@@ -589,7 +589,7 @@
// Create our new variable and add it to the symbol table.
InlineVariable result;
auto var = std::make_unique<Variable>(/*offset=*/-1,
- fModifiers->addToPool(Modifiers()),
+ this->modifiersPool().add(Modifiers{}),
name->c_str(),
type,
isBuiltinCode,
diff --git a/src/sksl/SkSLInliner.h b/src/sksl/SkSLInliner.h
index 29186db..ab8eecf 100644
--- a/src/sksl/SkSLInliner.h
+++ b/src/sksl/SkSLInliner.h
@@ -114,6 +114,8 @@
/** Checks whether inlining is viable for a FunctionCall, modulo recursion and function size. */
bool isSafeToInline(const FunctionDefinition* functionDef);
+ ModifiersPool& modifiersPool() const { return *fModifiers; }
+
const Context* fContext = nullptr;
ModifiersPool* fModifiers = nullptr;
Mangler fMangler;
diff --git a/src/sksl/SkSLModifiersPool.h b/src/sksl/SkSLModifiersPool.h
index 79d6ce8..798fa7c 100644
--- a/src/sksl/SkSLModifiersPool.h
+++ b/src/sksl/SkSLModifiersPool.h
@@ -20,7 +20,7 @@
*/
class ModifiersPool {
public:
- const Modifiers* addToPool(const Modifiers& modifiers) {
+ const Modifiers* add(const Modifiers& modifiers) {
auto [iter, wasInserted] = fModifiersSet.insert(modifiers);
return &*iter;
}
diff --git a/src/sksl/SkSLRehydrator.cpp b/src/sksl/SkSLRehydrator.cpp
index 46adfc7..44fba39 100644
--- a/src/sksl/SkSLRehydrator.cpp
+++ b/src/sksl/SkSLRehydrator.cpp
@@ -78,11 +78,10 @@
};
Rehydrator::Rehydrator(const Context* context, ModifiersPool* modifiers,
- std::shared_ptr<SymbolTable> symbolTable, ErrorReporter* errorReporter,
+ std::shared_ptr<SymbolTable> symbolTable,
const uint8_t* src, size_t length)
: fContext(*context)
, fModifiers(*modifiers)
- , fErrors(errorReporter)
, fSymbolTable(std::move(symbolTable))
, fStart(src)
SkDEBUGCODE(, fEnd(fStart + length)) {
@@ -184,8 +183,12 @@
const Type* returnType = this->type();
const FunctionDeclaration* result =
fSymbolTable->takeOwnershipOfSymbol(std::make_unique<FunctionDeclaration>(
- /*offset=*/-1, fModifiers.addToPool(modifiers), name,
- std::move(parameters), returnType, /*builtin=*/true));
+ /*offset=*/-1,
+ this->modifiersPool().add(modifiers),
+ name,
+ std::move(parameters),
+ returnType,
+ /*builtin=*/true));
this->addSymbol(id, result);
return result;
}
@@ -252,7 +255,7 @@
}
case kVariable_Command: {
uint16_t id = this->readU16();
- const Modifiers* m = fModifiers.addToPool(this->modifiers());
+ const Modifiers* m = this->modifiersPool().add(this->modifiers());
StringFragment name = this->readString();
const Type* type = this->type();
Variable::Storage storage = (Variable::Storage) this->readU8();
@@ -585,7 +588,7 @@
std::shared_ptr<SymbolTable> oldTable = fSymbolTable;
std::shared_ptr<SymbolTable> result =
inherit ? std::make_shared<SymbolTable>(fSymbolTable, /*builtin=*/true)
- : std::make_shared<SymbolTable>(fErrors, /*builtin=*/true);
+ : std::make_shared<SymbolTable>(this->errorReporter(), /*builtin=*/true);
fSymbolTable = result;
std::vector<const Symbol*> ownedSymbols;
ownedSymbols.reserve(ownedCount);
diff --git a/src/sksl/SkSLRehydrator.h b/src/sksl/SkSLRehydrator.h
index 09917f4..cdcad1d 100644
--- a/src/sksl/SkSLRehydrator.h
+++ b/src/sksl/SkSLRehydrator.h
@@ -11,6 +11,7 @@
#include "include/private/SkSLDefines.h"
#include "include/private/SkSLModifiers.h"
#include "include/private/SkSLSymbol.h"
+#include "src/sksl/SkSLContext.h"
#include <vector>
@@ -151,7 +152,7 @@
// src must remain in memory as long as the objects created from it do
Rehydrator(const Context* context, ModifiersPool* modifiers,
- std::shared_ptr<SymbolTable> symbolTable, ErrorReporter* errorReporter,
+ std::shared_ptr<SymbolTable> symbolTable,
const uint8_t* src, size_t length);
std::vector<std::unique_ptr<ProgramElement>> elements();
@@ -227,9 +228,12 @@
const Type* type();
+ ErrorReporter* errorReporter() { return &fContext.fErrors; }
+
+ ModifiersPool& modifiersPool() const { return fModifiers; }
+
const Context& fContext;
ModifiersPool& fModifiers;
- ErrorReporter* fErrors;
std::shared_ptr<SymbolTable> fSymbolTable;
std::vector<const Symbol*> fSymbols;
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index 13138c2..8ff7279 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -2078,7 +2078,7 @@
Modifiers::kUniform_Flag);
const Variable* intfVar = fSynthetics.takeOwnershipOfSymbol(
std::make_unique<Variable>(/*offset=*/-1,
- fProgram.fModifiers->addToPool(modifiers),
+ fProgram.fModifiers->add(modifiers),
name,
intfStruct.get(),
/*builtin=*/false,
@@ -3494,7 +3494,7 @@
Modifiers modifiers{layout, Modifiers::kUniform_Flag};
fUniformBuffer.fInnerVariable = std::make_unique<Variable>(
- /*offset=*/-1, fProgram.fModifiers->addToPool(modifiers), kUniformBufferName,
+ /*offset=*/-1, fProgram.fModifiers->add(modifiers), kUniformBufferName,
fUniformBuffer.fStruct.get(), /*builtin=*/false, Variable::Storage::kGlobal);
// Create an interface block object for this global variable.
diff --git a/src/sksl/dsl/DSLVar.cpp b/src/sksl/dsl/DSLVar.cpp
index ce5bca0..0f18abc 100644
--- a/src/sksl/dsl/DSLVar.cpp
+++ b/src/sksl/dsl/DSLVar.cpp
@@ -37,7 +37,7 @@
fVar = DSLWriter::SymbolTable()->takeOwnershipOfIRNode(
std::make_unique<SkSL::Variable>(
/*offset=*/-1,
- DSLWriter::IRGenerator().fModifiers->addToPool(
+ DSLWriter::IRGenerator().modifiersPool().add(
SkSL::Modifiers(
SkSL::Layout(/*flags=*/0, /*location=*/-1, /*offset=*/-1,
/*binding=*/-1, /*index=*/-1, /*set=*/-1,
diff --git a/src/sksl/dsl/priv/DSLWriter.cpp b/src/sksl/dsl/priv/DSLWriter.cpp
index 9121c3f..d0de74c 100644
--- a/src/sksl/dsl/priv/DSLWriter.cpp
+++ b/src/sksl/dsl/priv/DSLWriter.cpp
@@ -79,8 +79,8 @@
ProgramElements().clear();
}
-const SkSL::Modifiers* DSLWriter::Modifiers(SkSL::Modifiers modifiers) {
- return IRGenerator().fModifiers->addToPool(modifiers);
+const SkSL::Modifiers* DSLWriter::Modifiers(const SkSL::Modifiers& modifiers) {
+ return IRGenerator().modifiersPool().add(modifiers);
}
const char* DSLWriter::Name(const char* name) {
diff --git a/src/sksl/dsl/priv/DSLWriter.h b/src/sksl/dsl/priv/DSLWriter.h
index 154849c..3c379d0 100644
--- a/src/sksl/dsl/priv/DSLWriter.h
+++ b/src/sksl/dsl/priv/DSLWriter.h
@@ -83,7 +83,7 @@
* Returns the final pointer to a pooled Modifiers object that should be used to represent the
* given modifiers.
*/
- static const SkSL::Modifiers* Modifiers(SkSL::Modifiers modifiers);
+ static const SkSL::Modifiers* Modifiers(const SkSL::Modifiers& modifiers);
/**
* Returns the SkSL variable corresponding to a DSLVar.