Add Make factory method to VariableReference.
There aren't any optimization opportunities here, but it was the only expression/statement type left without a Make or Convert factory. Change-Id: I4c413a3b2619261f9e974528fa45211383e56fa7 Bug: skia:11342 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/402017 Auto-Submit: John Stiles <johnstiles@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
parent
4f0098227e
commit
a94e0261ef
@ -702,12 +702,12 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
|
||||
const Variable* loopIdx = &(*fSymbolTable)["sk_InvocationID"]->as<Variable>();
|
||||
auto test = BinaryExpression::Make(
|
||||
fContext,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx),
|
||||
VariableReference::Make(/*offset=*/-1, loopIdx),
|
||||
Token::Kind::TK_LT,
|
||||
IntLiteral::Make(fContext, /*offset=*/-1, fInvocations));
|
||||
auto next = PostfixExpression::Make(
|
||||
fContext,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx,VariableRefKind::kReadWrite),
|
||||
VariableReference::Make(/*offset=*/-1, loopIdx, VariableRefKind::kReadWrite),
|
||||
Token::Kind::TK_PLUSPLUS);
|
||||
ASTNode endPrimitiveID(&fFile->fNodes, -1, ASTNode::Kind::kIdentifier, "EndPrimitive");
|
||||
std::unique_ptr<Expression> endPrimitive = this->convertExpression(endPrimitiveID);
|
||||
@ -723,7 +723,7 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
|
||||
ExpressionArray{})));
|
||||
auto assignment = BinaryExpression::Make(
|
||||
fContext,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx, VariableRefKind::kWrite),
|
||||
VariableReference::Make(/*offset=*/-1, loopIdx, VariableRefKind::kWrite),
|
||||
Token::Kind::TK_EQ,
|
||||
IntLiteral::Make(fContext, /*offset=*/-1, /*value=*/0));
|
||||
auto initializer = ExpressionStatement::Make(fContext, std::move(assignment));
|
||||
@ -750,12 +750,10 @@ std::unique_ptr<Statement> IRGenerator::getNormalizeSkPositionCode() {
|
||||
// sk_Position.w);
|
||||
SkASSERT(skPerVertex && fRTAdjust);
|
||||
auto Ref = [](const Variable* var) -> std::unique_ptr<Expression> {
|
||||
return std::make_unique<VariableReference>(/*offset=*/-1, var,
|
||||
VariableReference::RefKind::kRead);
|
||||
return VariableReference::Make(/*offset=*/-1, var, VariableReference::RefKind::kRead);
|
||||
};
|
||||
auto WRef = [](const Variable* var) -> std::unique_ptr<Expression> {
|
||||
return std::make_unique<VariableReference>(/*offset=*/-1, var,
|
||||
VariableReference::RefKind::kWrite);
|
||||
return VariableReference::Make(/*offset=*/-1, var, VariableReference::RefKind::kWrite);
|
||||
};
|
||||
auto Field = [&](const Variable* var, int idx) -> std::unique_ptr<Expression> {
|
||||
return FieldAccess::Make(fContext, Ref(var), idx,
|
||||
@ -1590,14 +1588,12 @@ std::unique_ptr<Expression> IRGenerator::convertIdentifier(int offset, StringFra
|
||||
}
|
||||
}
|
||||
// default to kRead_RefKind; this will be corrected later if the variable is written to
|
||||
return std::make_unique<VariableReference>(offset,
|
||||
var,
|
||||
VariableReference::RefKind::kRead);
|
||||
return VariableReference::Make(offset, var, VariableReference::RefKind::kRead);
|
||||
}
|
||||
case Symbol::Kind::kField: {
|
||||
const Field* field = &result->as<Field>();
|
||||
auto base = std::make_unique<VariableReference>(offset, &field->owner(),
|
||||
VariableReference::RefKind::kRead);
|
||||
auto base = VariableReference::Make(offset, &field->owner(),
|
||||
VariableReference::RefKind::kRead);
|
||||
return FieldAccess::Make(fContext, std::move(base), field->fieldIndex(),
|
||||
FieldAccess::OwnerKind::kAnonymousInterfaceBlock);
|
||||
}
|
||||
|
@ -550,7 +550,7 @@ std::unique_ptr<Statement> Inliner::inlineStatement(int offset,
|
||||
variable.type().clone(symbolTableForStatement),
|
||||
isBuiltinCode,
|
||||
variable.storage());
|
||||
(*varMap)[&variable] = std::make_unique<VariableReference>(offset, clonedVar.get());
|
||||
(*varMap)[&variable] = VariableReference::Make(offset, clonedVar.get());
|
||||
auto result = VarDeclaration::Make(*fContext,
|
||||
clonedVar.get(),
|
||||
decl.baseType().clone(symbolTableForStatement),
|
||||
@ -646,7 +646,7 @@ Inliner::InlinedCall Inliner::inlineCall(FunctionCall* call,
|
||||
symbolTable.get(), Modifiers{},
|
||||
caller->isBuiltin(), &noInitialValue);
|
||||
inlineStatements.push_back(std::move(var.fVarDecl));
|
||||
resultExpr = std::make_unique<VariableReference>(/*offset=*/-1, var.fVarSymbol);
|
||||
resultExpr = VariableReference::Make(/*offset=*/-1, var.fVarSymbol);
|
||||
}
|
||||
|
||||
// Create variables in the extra statements to hold the arguments, and assign the arguments to
|
||||
@ -670,7 +670,7 @@ Inliner::InlinedCall Inliner::inlineCall(FunctionCall* call,
|
||||
symbolTable.get(), param->modifiers(),
|
||||
caller->isBuiltin(), &arguments[i]);
|
||||
inlineStatements.push_back(std::move(var.fVarDecl));
|
||||
varMap[param] = std::make_unique<VariableReference>(/*offset=*/-1, var.fVarSymbol);
|
||||
varMap[param] = VariableReference::Make(/*offset=*/-1, var.fVarSymbol);
|
||||
}
|
||||
|
||||
for (const std::unique_ptr<Statement>& stmt : body.children()) {
|
||||
|
@ -564,7 +564,7 @@ std::unique_ptr<Expression> Rehydrator::expression() {
|
||||
case Rehydrator::kVariableReference_Command: {
|
||||
const Variable* var = this->symbolRef<Variable>(Symbol::Kind::kVariable);
|
||||
VariableReference::RefKind refKind = (VariableReference::RefKind) this->readU8();
|
||||
return std::make_unique<VariableReference>(-1, var, refKind);
|
||||
return VariableReference::Make(/*offset=*/-1, var, refKind);
|
||||
}
|
||||
case Rehydrator::kVoid_Command:
|
||||
return nullptr;
|
||||
|
@ -37,7 +37,16 @@ public:
|
||||
|
||||
static constexpr Kind kExpressionKind = Kind::kVariableReference;
|
||||
|
||||
VariableReference(int offset, const Variable* variable, RefKind refKind = RefKind::kRead);
|
||||
VariableReference(int offset, const Variable* variable, RefKind refKind);
|
||||
|
||||
// Creates a VariableReference. There isn't much in the way of error-checking or optimization
|
||||
// opportunities here.
|
||||
static std::unique_ptr<Expression> Make(int offset,
|
||||
const Variable* variable,
|
||||
RefKind refKind = RefKind::kRead) {
|
||||
SkASSERT(variable);
|
||||
return std::make_unique<VariableReference>(offset, variable, refKind);
|
||||
}
|
||||
|
||||
VariableReference(const VariableReference&) = delete;
|
||||
VariableReference& operator=(const VariableReference&) = delete;
|
||||
@ -58,8 +67,7 @@ public:
|
||||
bool isConstantOrUniform() const override;
|
||||
|
||||
std::unique_ptr<Expression> clone() const override {
|
||||
return std::unique_ptr<Expression>(new VariableReference(fOffset, this->variable(),
|
||||
this->refKind()));
|
||||
return std::make_unique<VariableReference>(fOffset, this->variable(), this->refKind());
|
||||
}
|
||||
|
||||
String description() const override;
|
||||
|
Loading…
Reference in New Issue
Block a user