Index: src/sksl/SkSLIRGenerator.cpp |
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp |
index f250c4bb0cc0d59c44c2a72244c78ce0203f6985..0bbd0b2b37e99a53bece98b8d1d2a33ffe47c8fa 100644 |
--- a/src/sksl/SkSLIRGenerator.cpp |
+++ b/src/sksl/SkSLIRGenerator.cpp |
@@ -182,7 +182,6 @@ std::unique_ptr<VarDeclaration> IRGenerator::convertVarDeclaration(const ASTVarD |
currentVarSizes.push_back(nullptr); |
} |
} |
- sizes.push_back(std::move(currentVarSizes)); |
auto var = std::unique_ptr<Variable>(new Variable(decl.fPosition, modifiers, decl.fNames[i], |
*type, storage)); |
std::unique_ptr<Expression> value; |
@@ -193,9 +192,16 @@ std::unique_ptr<VarDeclaration> IRGenerator::convertVarDeclaration(const ASTVarD |
} |
value = this->coerce(std::move(value), *type); |
} |
- variables.push_back(var.get()); |
- fSymbolTable->add(decl.fNames[i], std::move(var)); |
- values.push_back(std::move(value)); |
+ if ("gl_FragCoord" == decl.fNames[i] && (*fSymbolTable)[decl.fNames[i]]) { |
+ // already defined, just update the modifiers |
+ Variable* old = (Variable*) (*fSymbolTable)[decl.fNames[i]]; |
+ old->fModifiers = var->fModifiers; |
+ } else { |
+ variables.push_back(var.get()); |
+ fSymbolTable->add(decl.fNames[i], std::move(var)); |
+ values.push_back(std::move(value)); |
+ sizes.push_back(std::move(currentVarSizes)); |
+ } |
} |
return std::unique_ptr<VarDeclaration>(new VarDeclaration(decl.fPosition, std::move(variables), |
std::move(sizes), std::move(values))); |
@@ -574,7 +580,8 @@ std::unique_ptr<Expression> IRGenerator::convertIdentifier(const ASTIdentifier& |
const Field* field = (const Field*) result; |
VariableReference* base = new VariableReference(identifier.fPosition, field->fOwner); |
return std::unique_ptr<Expression>(new FieldAccess(std::unique_ptr<Expression>(base), |
- field->fFieldIndex)); |
+ field->fFieldIndex, |
+ true)); |
dogben
2016/07/31 23:20:20
nit: use enum, or "/*inAnonymousInterfaceBlock*/ t
ethannicholas
2016/08/02 16:13:18
Done.
|
} |
case Symbol::kType_Kind: { |
const Type* t = (const Type*) result; |
@@ -651,18 +658,31 @@ static bool determine_binary_type(const Context& context, |
right.canCoerceTo(*context.fBool_Type); |
case Token::STAR: // fall through |
case Token::STAREQ: |
- // FIXME need to handle non-square matrices |
if (left.kind() == Type::kMatrix_Kind && right.kind() == Type::kVector_Kind) { |
- *outLeftType = &left; |
- *outRightType = &right; |
- *outResultType = &right; |
- return left.rows() == right.columns(); |
+ // determine final component type |
+ if (determine_binary_type(context, Token::STAR, left.componentType(), |
+ right.componentType(), outLeftType, outRightType, |
+ outResultType, false)) { |
+ *outLeftType = &left; |
dogben
2016/07/31 23:20:21
Seems like you need *outLeftType = &(*outResultTyp
ethannicholas
2016/08/02 16:13:18
Completely reworked this.
|
+ *outRightType = &right; |
+ *outResultType = &(*outResultType)->toCompound(context, left.rows(), 1); |
+ return left.rows() == right.columns(); |
dogben
2016/07/31 23:20:20
Should be left.columns() == right.columns() becaus
|
+ } else { |
+ return false; |
+ } |
} |
if (left.kind() == Type::kVector_Kind && right.kind() == Type::kMatrix_Kind) { |
- *outLeftType = &left; |
- *outRightType = &right; |
- *outResultType = &left; |
- return left.columns() == right.columns(); |
+ // determine final component type |
+ if (determine_binary_type(context, Token::STAR, left.componentType(), |
+ right.componentType(), outLeftType, outRightType, |
+ outResultType, false)) { |
+ *outLeftType = &left; |
+ *outRightType = &right; |
+ *outResultType = &(*outResultType)->toCompound(context, right.columns(), 1); |
+ return left.columns() == right.rows(); |
+ } else { |
+ return false; |
+ } |
} |
// fall through |
default: |
@@ -1043,7 +1063,7 @@ std::unique_ptr<Expression> IRGenerator::convertField(std::unique_ptr<Expression |
auto fields = base->fType.fields(); |
for (size_t i = 0; i < fields.size(); i++) { |
if (fields[i].fName == field) { |
- return std::unique_ptr<Expression>(new FieldAccess(std::move(base), (int) i)); |
+ return std::unique_ptr<Expression>(new FieldAccess(std::move(base), (int) i, false)); |
} |
} |
fErrors.error(base->fPosition, "type '" + base->fType.description() + "' does not have a " |