| Index: src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| index 2771e0291b8898ff2e805eb890dc931223f3ebb3..8a38cf7028bf263b77ed479d848362f9c91a7bfb 100644
|
| --- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| +++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| @@ -1151,7 +1151,7 @@ SpvId SPIRVCodeGenerator::getPointerType(const Type& type,
|
| return entry->second;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeExpression(Expression& expr, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeExpression(const Expression& expr, std::ostream& out) {
|
| switch (expr.fKind) {
|
| case Expression::kBinary_Kind:
|
| return this->writeBinaryExpression((BinaryExpression&) expr, out);
|
| @@ -1185,7 +1185,7 @@ SpvId SPIRVCodeGenerator::writeExpression(Expression& expr, std::ostream& out) {
|
| return -1;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeIntrinsicCall(FunctionCall& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeIntrinsicCall(const FunctionCall& c, std::ostream& out) {
|
| auto intrinsic = fIntrinsicMap.find(c.fFunction.fName);
|
| ASSERT(intrinsic != fIntrinsicMap.end());
|
| const Type& type = c.fArguments[0]->fType;
|
| @@ -1240,7 +1240,7 @@ SpvId SPIRVCodeGenerator::writeIntrinsicCall(FunctionCall& c, std::ostream& out)
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(FunctionCall& c, SpecialIntrinsic kind,
|
| +SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(const FunctionCall& c, SpecialIntrinsic kind,
|
| std::ostream& out) {
|
| SpvId result = this->nextId();
|
| switch (kind) {
|
| @@ -1305,7 +1305,7 @@ SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(FunctionCall& c, SpecialIntrinsi
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeFunctionCall(FunctionCall& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeFunctionCall(const FunctionCall& c, std::ostream& out) {
|
| const auto& entry = fFunctionMap.find(&c.fFunction);
|
| if (entry == fFunctionMap.end()) {
|
| return this->writeIntrinsicCall(c, out);
|
| @@ -1366,7 +1366,7 @@ SpvId SPIRVCodeGenerator::writeFunctionCall(FunctionCall& c, std::ostream& out)
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeConstantVector(Constructor& c) {
|
| +SpvId SPIRVCodeGenerator::writeConstantVector(const Constructor& c) {
|
| ASSERT(c.fType.kind() == Type::kVector_Kind && c.isConstant());
|
| SpvId result = this->nextId();
|
| std::vector<SpvId> arguments;
|
| @@ -1394,7 +1394,7 @@ SpvId SPIRVCodeGenerator::writeConstantVector(Constructor& c) {
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeFloatConstructor(Constructor& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeFloatConstructor(const Constructor& c, std::ostream& out) {
|
| ASSERT(c.fType == *fContext.fFloat_Type);
|
| ASSERT(c.fArguments.size() == 1);
|
| ASSERT(c.fArguments[0]->fType.isNumber());
|
| @@ -1412,7 +1412,7 @@ SpvId SPIRVCodeGenerator::writeFloatConstructor(Constructor& c, std::ostream& ou
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeIntConstructor(Constructor& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeIntConstructor(const Constructor& c, std::ostream& out) {
|
| ASSERT(c.fType == *fContext.fInt_Type);
|
| ASSERT(c.fArguments.size() == 1);
|
| ASSERT(c.fArguments[0]->fType.isNumber());
|
| @@ -1430,7 +1430,7 @@ SpvId SPIRVCodeGenerator::writeIntConstructor(Constructor& c, std::ostream& out)
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeMatrixConstructor(Constructor& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeMatrixConstructor(const Constructor& c, std::ostream& out) {
|
| ASSERT(c.fType.kind() == Type::kMatrix_Kind);
|
| // go ahead and write the arguments so we don't try to write new instructions in the middle of
|
| // an instruction
|
| @@ -1502,7 +1502,7 @@ SpvId SPIRVCodeGenerator::writeMatrixConstructor(Constructor& c, std::ostream& o
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeVectorConstructor(Constructor& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeVectorConstructor(const Constructor& c, std::ostream& out) {
|
| ASSERT(c.fType.kind() == Type::kVector_Kind);
|
| if (c.isConstant()) {
|
| return this->writeConstantVector(c);
|
| @@ -1532,7 +1532,7 @@ SpvId SPIRVCodeGenerator::writeVectorConstructor(Constructor& c, std::ostream& o
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeConstructor(Constructor& c, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeConstructor(const Constructor& c, std::ostream& out) {
|
| if (c.fType == *fContext.fFloat_Type) {
|
| return this->writeFloatConstructor(c, out);
|
| } else if (c.fType == *fContext.fInt_Type) {
|
| @@ -1560,7 +1560,7 @@ SpvStorageClass_ get_storage_class(const Modifiers& modifiers) {
|
| }
|
| }
|
|
|
| -SpvStorageClass_ get_storage_class(Expression& expr) {
|
| +SpvStorageClass_ get_storage_class(const Expression& expr) {
|
| switch (expr.fKind) {
|
| case Expression::kVariableReference_Kind:
|
| return get_storage_class(((VariableReference&) expr).fVariable.fModifiers);
|
| @@ -1573,7 +1573,7 @@ SpvStorageClass_ get_storage_class(Expression& expr) {
|
| }
|
| }
|
|
|
| -std::vector<SpvId> SPIRVCodeGenerator::getAccessChain(Expression& expr, std::ostream& out) {
|
| +std::vector<SpvId> SPIRVCodeGenerator::getAccessChain(const Expression& expr, std::ostream& out) {
|
| std::vector<SpvId> chain;
|
| switch (expr.fKind) {
|
| case Expression::kIndex_Kind: {
|
| @@ -1697,7 +1697,7 @@ private:
|
| const Type& fSwizzleType;
|
| };
|
|
|
| -std::unique_ptr<SPIRVCodeGenerator::LValue> SPIRVCodeGenerator::getLValue(Expression& expr,
|
| +std::unique_ptr<SPIRVCodeGenerator::LValue> SPIRVCodeGenerator::getLValue(const Expression& expr,
|
| std::ostream& out) {
|
| switch (expr.fKind) {
|
| case Expression::kVariableReference_Kind: {
|
| @@ -1771,7 +1771,7 @@ std::unique_ptr<SPIRVCodeGenerator::LValue> SPIRVCodeGenerator::getLValue(Expres
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeVariableReference(VariableReference& ref, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeVariableReference(const VariableReference& ref, std::ostream& out) {
|
| auto entry = fVariableMap.find(&ref.fVariable);
|
| ASSERT(entry != fVariableMap.end());
|
| SpvId var = entry->second;
|
| @@ -1780,15 +1780,15 @@ SpvId SPIRVCodeGenerator::writeVariableReference(VariableReference& ref, std::os
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeIndexExpression(IndexExpression& expr, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeIndexExpression(const IndexExpression& expr, std::ostream& out) {
|
| return getLValue(expr, out)->load(out);
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeFieldAccess(FieldAccess& f, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeFieldAccess(const FieldAccess& f, std::ostream& out) {
|
| return getLValue(f, out)->load(out);
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeSwizzle(Swizzle& swizzle, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeSwizzle(const Swizzle& swizzle, std::ostream& out) {
|
| SpvId base = this->writeExpression(*swizzle.fBase, out);
|
| SpvId result = this->nextId();
|
| size_t count = swizzle.fComponents.size();
|
| @@ -1849,7 +1849,7 @@ bool is_assignment(Token::Kind op) {
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeBinaryExpression(BinaryExpression& b, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeBinaryExpression(const BinaryExpression& b, std::ostream& out) {
|
| // handle cases where we don't necessarily evaluate both LHS and RHS
|
| switch (b.fOperator) {
|
| case Token::EQ: {
|
| @@ -2041,7 +2041,7 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(BinaryExpression& b, std::ostrea
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeLogicalAnd(BinaryExpression& a, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeLogicalAnd(const BinaryExpression& a, std::ostream& out) {
|
| ASSERT(a.fOperator == Token::LOGICALAND);
|
| BoolLiteral falseLiteral(fContext, Position(), false);
|
| SpvId falseConstant = this->writeBoolLiteral(falseLiteral);
|
| @@ -2062,7 +2062,7 @@ SpvId SPIRVCodeGenerator::writeLogicalAnd(BinaryExpression& a, std::ostream& out
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeLogicalOr(BinaryExpression& o, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeLogicalOr(const BinaryExpression& o, std::ostream& out) {
|
| ASSERT(o.fOperator == Token::LOGICALOR);
|
| BoolLiteral trueLiteral(fContext, Position(), true);
|
| SpvId trueConstant = this->writeBoolLiteral(trueLiteral);
|
| @@ -2083,7 +2083,7 @@ SpvId SPIRVCodeGenerator::writeLogicalOr(BinaryExpression& o, std::ostream& out)
|
| return result;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeTernaryExpression(TernaryExpression& t, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writeTernaryExpression(const TernaryExpression& t, std::ostream& out) {
|
| SpvId test = this->writeExpression(*t.fTest, out);
|
| if (t.fIfTrue->isConstant() && t.fIfFalse->isConstant()) {
|
| // both true and false are constants, can just use OpSelect
|
| @@ -2127,7 +2127,7 @@ std::unique_ptr<Expression> create_literal_1(const Context& context, const Type&
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writePrefixExpression(PrefixExpression& p, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writePrefixExpression(const PrefixExpression& p, std::ostream& out) {
|
| if (p.fOperator == Token::MINUS) {
|
| SpvId result = this->nextId();
|
| SpvId typeId = this->getType(p.fType);
|
| @@ -2174,7 +2174,7 @@ SpvId SPIRVCodeGenerator::writePrefixExpression(PrefixExpression& p, std::ostrea
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writePostfixExpression(PostfixExpression& p, std::ostream& out) {
|
| +SpvId SPIRVCodeGenerator::writePostfixExpression(const PostfixExpression& p, std::ostream& out) {
|
| std::unique_ptr<LValue> lv = this->getLValue(*p.fOperand, out);
|
| SpvId result = lv->load(out);
|
| SpvId one = this->writeExpression(*create_literal_1(fContext, p.fType), out);
|
| @@ -2196,7 +2196,7 @@ SpvId SPIRVCodeGenerator::writePostfixExpression(PostfixExpression& p, std::ostr
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeBoolLiteral(BoolLiteral& b) {
|
| +SpvId SPIRVCodeGenerator::writeBoolLiteral(const BoolLiteral& b) {
|
| if (b.fValue) {
|
| if (fBoolTrue == 0) {
|
| fBoolTrue = this->nextId();
|
| @@ -2214,7 +2214,7 @@ SpvId SPIRVCodeGenerator::writeBoolLiteral(BoolLiteral& b) {
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeIntLiteral(IntLiteral& i) {
|
| +SpvId SPIRVCodeGenerator::writeIntLiteral(const IntLiteral& i) {
|
| if (i.fType == *fContext.fInt_Type) {
|
| auto entry = fIntConstants.find(i.fValue);
|
| if (entry == fIntConstants.end()) {
|
| @@ -2239,7 +2239,7 @@ SpvId SPIRVCodeGenerator::writeIntLiteral(IntLiteral& i) {
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeFloatLiteral(FloatLiteral& f) {
|
| +SpvId SPIRVCodeGenerator::writeFloatLiteral(const FloatLiteral& f) {
|
| if (f.fType == *fContext.fFloat_Type) {
|
| float value = (float) f.fValue;
|
| auto entry = fFloatConstants.find(value);
|
| @@ -2350,7 +2350,7 @@ void SPIRVCodeGenerator::writeLayout(const Layout& layout, SpvId target, int mem
|
| }
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::writeInterfaceBlock(InterfaceBlock& intf) {
|
| +SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
|
| SpvId type = this->getType(intf.fVariable.fType);
|
| SpvId result = this->nextId();
|
| this->writeInstruction(SpvOpDecorate, type, SpvDecorationBlock, fDecorationBuffer);
|
| @@ -2363,7 +2363,7 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(InterfaceBlock& intf) {
|
| return result;
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeGlobalVars(VarDeclaration& decl, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeGlobalVars(const VarDeclaration& decl, std::ostream& out) {
|
| for (size_t i = 0; i < decl.fVars.size(); i++) {
|
| if (!decl.fVars[i]->fIsReadFrom && !decl.fVars[i]->fIsWrittenTo &&
|
| !(decl.fVars[i]->fModifiers.fFlags & (Modifiers::kIn_Flag |
|
| @@ -2399,17 +2399,17 @@ void SPIRVCodeGenerator::writeGlobalVars(VarDeclaration& decl, std::ostream& out
|
| (SpvId) decl.fVars[i]->fType.stride(), fDecorationBuffer);
|
| }
|
| if (decl.fValues[i]) {
|
| - ASSERT(!fCurrentBlock);
|
| - fCurrentBlock = -1;
|
| + ASSERT(!fCurrentBlock);
|
| + fCurrentBlock = -1;
|
| SpvId value = this->writeExpression(*decl.fValues[i], fGlobalInitializersBuffer);
|
| this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuffer);
|
| - fCurrentBlock = 0;
|
| + fCurrentBlock = 0;
|
| }
|
| this->writeLayout(decl.fVars[i]->fModifiers.fLayout, id);
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeVarDeclaration(VarDeclaration& decl, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeVarDeclaration(const VarDeclaration& decl, std::ostream& out) {
|
| for (size_t i = 0; i < decl.fVars.size(); i++) {
|
| SpvId id = this->nextId();
|
| fVariableMap[decl.fVars[i]] = id;
|
| @@ -2423,7 +2423,7 @@ void SPIRVCodeGenerator::writeVarDeclaration(VarDeclaration& decl, std::ostream&
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeStatement(Statement& s, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeStatement(const Statement& s, std::ostream& out) {
|
| switch (s.fKind) {
|
| case Statement::kBlock_Kind:
|
| this->writeBlock((Block&) s, out);
|
| @@ -2457,13 +2457,13 @@ void SPIRVCodeGenerator::writeStatement(Statement& s, std::ostream& out) {
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeBlock(Block& b, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeBlock(const Block& b, std::ostream& out) {
|
| for (size_t i = 0; i < b.fStatements.size(); i++) {
|
| this->writeStatement(*b.fStatements[i], out);
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeIfStatement(IfStatement& stmt, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeIfStatement(const IfStatement& stmt, std::ostream& out) {
|
| SpvId test = this->writeExpression(*stmt.fTest, out);
|
| SpvId ifTrue = this->nextId();
|
| SpvId ifFalse = this->nextId();
|
| @@ -2494,7 +2494,7 @@ void SPIRVCodeGenerator::writeIfStatement(IfStatement& stmt, std::ostream& out)
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeForStatement(ForStatement& f, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeForStatement(const ForStatement& f, std::ostream& out) {
|
| if (f.fInitializer) {
|
| this->writeStatement(*f.fInitializer, out);
|
| }
|
| @@ -2508,7 +2508,7 @@ void SPIRVCodeGenerator::writeForStatement(ForStatement& f, std::ostream& out) {
|
| this->writeInstruction(SpvOpBranch, header, out);
|
| this->writeLabel(header, out);
|
| this->writeInstruction(SpvOpLoopMerge, end, next, SpvLoopControlMaskNone, out);
|
| - this->writeInstruction(SpvOpBranch, start, out);
|
| + this->writeInstruction(SpvOpBranch, start, out);
|
| this->writeLabel(start, out);
|
| SpvId test = this->writeExpression(*f.fTest, out);
|
| this->writeInstruction(SpvOpBranchConditional, test, body, end, out);
|
| @@ -2527,7 +2527,7 @@ void SPIRVCodeGenerator::writeForStatement(ForStatement& f, std::ostream& out) {
|
| fContinueTarget.pop();
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeReturnStatement(ReturnStatement& r, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeReturnStatement(const ReturnStatement& r, std::ostream& out) {
|
| if (r.fExpression) {
|
| this->writeInstruction(SpvOpReturnValue, this->writeExpression(*r.fExpression, out),
|
| out);
|
| @@ -2536,7 +2536,7 @@ void SPIRVCodeGenerator::writeReturnStatement(ReturnStatement& r, std::ostream&
|
| }
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeInstructions(Program& program, std::ostream& out) {
|
| +void SPIRVCodeGenerator::writeInstructions(const Program& program, std::ostream& out) {
|
| fGLSLExtendedInstructions = this->nextId();
|
| std::stringstream body;
|
| std::vector<SpvId> interfaceVars;
|
| @@ -2569,7 +2569,7 @@ void SPIRVCodeGenerator::writeInstructions(Program& program, std::ostream& out)
|
| }
|
| const FunctionDeclaration* main = nullptr;
|
| for (auto entry : fFunctionMap) {
|
| - if (entry.first->fName == "main") {
|
| + if (entry.first->fName == "main") {
|
| main = entry.first;
|
| }
|
| }
|
| @@ -2621,7 +2621,7 @@ void SPIRVCodeGenerator::writeInstructions(Program& program, std::ostream& out)
|
| out << body.str();
|
| }
|
|
|
| -void SPIRVCodeGenerator::generateCode(Program& program, std::ostream& out) {
|
| +void SPIRVCodeGenerator::generateCode(const Program& program, std::ostream& out) {
|
| this->writeWord(SpvMagicNumber, out);
|
| this->writeWord(SpvVersion, out);
|
| this->writeWord(SKSL_MAGIC, out);
|
|
|