moved SkSL Variable data into IRNode
Change-Id: I53af66c1b65971c204ac7c515e0d0e39481b015d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/323097
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/sksl/SkSLMetalCodeGenerator.cpp b/src/sksl/SkSLMetalCodeGenerator.cpp
index 2ef5451..8dfb0f9 100644
--- a/src/sksl/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/SkSLMetalCodeGenerator.cpp
@@ -265,7 +265,7 @@
const Expression& arg = *arguments[i];
this->write(separator);
separator = ", ";
- if (function.fParameters[i]->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ if (function.fParameters[i]->modifiers().fFlags & Modifiers::kOut_Flag) {
this->write("&");
}
this->writeExpression(arg, kSequence_Precedence);
@@ -680,7 +680,7 @@
}
void MetalCodeGenerator::writeVariableReference(const VariableReference& ref) {
- switch (ref.fVariable->fModifiers.fLayout.fBuiltin) {
+ switch (ref.fVariable->modifiers().fLayout.fBuiltin) {
case SK_FRAGCOLOR_BUILTIN:
this->write("_out->sk_FragColor");
break;
@@ -699,12 +699,12 @@
this->write(fProgram.fSettings.fFlipY ? "_frontFacing" : "(!_frontFacing)");
break;
default:
- if (Variable::kGlobal_Storage == ref.fVariable->fStorage) {
- if (ref.fVariable->fModifiers.fFlags & Modifiers::kIn_Flag) {
+ if (Variable::kGlobal_Storage == ref.fVariable->storage()) {
+ if (ref.fVariable->modifiers().fFlags & Modifiers::kIn_Flag) {
this->write("_in.");
- } else if (ref.fVariable->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ } else if (ref.fVariable->modifiers().fFlags & Modifiers::kOut_Flag) {
this->write("_out->");
- } else if (ref.fVariable->fModifiers.fFlags & Modifiers::kUniform_Flag &&
+ } else if (ref.fVariable->modifiers().fFlags & Modifiers::kUniform_Flag &&
ref.fVariable->type().typeKind() != Type::TypeKind::kSampler) {
this->write("_uniforms.");
} else {
@@ -836,8 +836,8 @@
this->write("(");
}
if (Compiler::IsAssignment(op) && left.is<VariableReference>() &&
- left.as<VariableReference>().fVariable->fStorage == Variable::kParameter_Storage &&
- left.as<VariableReference>().fVariable->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ left.as<VariableReference>().fVariable->storage() == Variable::kParameter_Storage &&
+ left.as<VariableReference>().fVariable->modifiers().fFlags & Modifiers::kOut_Flag) {
// writing to an out parameter. Since we have to turn those into pointers, we have to
// dereference it here.
this->write("*");
@@ -955,7 +955,7 @@
const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
const VarDeclaration& var = *decls.fDecl;
if (var.fVar->type().typeKind() == Type::TypeKind::kSampler) {
- if (var.fVar->fModifiers.fLayout.fBinding < 0) {
+ if (var.fVar->modifiers().fLayout.fBinding < 0) {
fErrors.error(decls.fOffset,
"Metal samplers must have 'layout(binding=...)'");
return;
@@ -968,13 +968,13 @@
this->write(", texture2d<float> ");
this->writeName(var.fVar->name());
this->write("[[texture(");
- this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
+ this->write(to_string(var.fVar->modifiers().fLayout.fBinding));
this->write(")]]");
this->write(", sampler ");
this->writeName(var.fVar->name());
this->write(SAMPLER_SUFFIX);
this->write("[[sampler(");
- this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
+ this->write(to_string(var.fVar->modifiers().fLayout.fBinding));
this->write(")]]");
}
} else if (e.kind() == ProgramElement::Kind::kInterfaceBlock) {
@@ -987,7 +987,7 @@
this->write("& " );
this->write(fInterfaceBlockNameMap[&intf]);
this->write(" [[buffer(");
- this->write(to_string(intf.fVariable.fModifiers.fLayout.fBinding));
+ this->write(to_string(intf.fVariable.modifiers().fLayout.fBinding));
this->write(")]]");
}
}
@@ -1036,7 +1036,7 @@
for (const auto& param : f.fDeclaration.fParameters) {
this->write(separator);
separator = ", ";
- this->writeModifiers(param->fModifiers, false);
+ this->writeModifiers(param->modifiers(), false);
std::vector<int> sizes;
const Type* type = ¶m->type();
while (type->typeKind() == Type::TypeKind::kArray) {
@@ -1044,7 +1044,7 @@
type = &type->componentType();
}
this->writeType(*type);
- if (param->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ if (param->modifiers().fFlags & Modifiers::kOut_Flag) {
this->write("*");
}
this->write(" ");
@@ -1113,7 +1113,7 @@
if ("sk_PerVertex" == intf.fTypeName) {
return;
}
- this->writeModifiers(intf.fVariable.fModifiers, true);
+ this->writeModifiers(intf.fVariable.modifiers(), true);
this->write("struct ");
this->writeLine(intf.fTypeName + " {");
const Type* structType = &intf.fVariable.type();
@@ -1215,10 +1215,10 @@
}
void MetalCodeGenerator::writeVarDeclaration(const VarDeclaration& var, bool global) {
- if (global && !(var.fVar->fModifiers.fFlags & Modifiers::kConst_Flag)) {
+ if (global && !(var.fVar->modifiers().fFlags & Modifiers::kConst_Flag)) {
return;
}
- this->writeModifiers(var.fVar->fModifiers, global);
+ this->writeModifiers(var.fVar->modifiers(), global);
this->writeType(var.fBaseType);
this->write(" ");
this->writeName(var.fVar->name());
@@ -1393,15 +1393,15 @@
if (e.is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
const Variable& var = *decls.fDecl->fVar;
- if (var.fModifiers.fFlags & Modifiers::kUniform_Flag &&
+ if (var.modifiers().fFlags & Modifiers::kUniform_Flag &&
var.type().typeKind() != Type::TypeKind::kSampler) {
if (-1 == fUniformBuffer) {
this->write("struct Uniforms {\n");
- fUniformBuffer = var.fModifiers.fLayout.fSet;
+ fUniformBuffer = var.modifiers().fLayout.fSet;
if (-1 == fUniformBuffer) {
fErrors.error(decls.fOffset, "Metal uniforms must have 'layout(set=...)'");
}
- } else if (var.fModifiers.fLayout.fSet != fUniformBuffer) {
+ } else if (var.modifiers().fLayout.fSet != fUniformBuffer) {
if (-1 == fUniformBuffer) {
fErrors.error(decls.fOffset, "Metal backend requires all uniforms to have "
"the same 'layout(set=...)'");
@@ -1426,19 +1426,19 @@
if (e.is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
const Variable& var = *decls.fDecl->fVar;
- if (var.fModifiers.fFlags & Modifiers::kIn_Flag &&
- -1 == var.fModifiers.fLayout.fBuiltin) {
+ if (var.modifiers().fFlags & Modifiers::kIn_Flag &&
+ -1 == var.modifiers().fLayout.fBuiltin) {
this->write(" ");
this->writeType(var.type());
this->write(" ");
this->writeName(var.name());
- if (-1 != var.fModifiers.fLayout.fLocation) {
+ if (-1 != var.modifiers().fLayout.fLocation) {
if (fProgram.fKind == Program::kVertex_Kind) {
this->write(" [[attribute(" +
- to_string(var.fModifiers.fLayout.fLocation) + ")]]");
+ to_string(var.modifiers().fLayout.fLocation) + ")]]");
} else if (fProgram.fKind == Program::kFragment_Kind) {
this->write(" [[user(locn" +
- to_string(var.fModifiers.fLayout.fLocation) + ")]]");
+ to_string(var.modifiers().fLayout.fLocation) + ")]]");
}
}
this->write(";\n");
@@ -1459,19 +1459,19 @@
if (e.is<GlobalVarDeclaration>()) {
const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
const Variable& var = *decls.fDecl->fVar;
- if (var.fModifiers.fFlags & Modifiers::kOut_Flag &&
- -1 == var.fModifiers.fLayout.fBuiltin) {
+ if (var.modifiers().fFlags & Modifiers::kOut_Flag &&
+ -1 == var.modifiers().fLayout.fBuiltin) {
this->write(" ");
this->writeType(var.type());
this->write(" ");
this->writeName(var.name());
if (fProgram.fKind == Program::kVertex_Kind) {
this->write(" [[user(locn" +
- to_string(var.fModifiers.fLayout.fLocation) + ")]]");
+ to_string(var.modifiers().fLayout.fLocation) + ")]]");
} else if (fProgram.fKind == Program::kFragment_Kind) {
this->write(" [[color(" +
- to_string(var.fModifiers.fLayout.fLocation) +")");
- int colorIndex = var.fModifiers.fLayout.fIndex;
+ to_string(var.modifiers().fLayout.fLocation) +")");
+ int colorIndex = var.modifiers().fLayout.fIndex;
if (colorIndex) {
this->write(", index(" + to_string(colorIndex) + ")");
}
@@ -1514,7 +1514,7 @@
const GlobalVarDeclaration& decls = element.as<GlobalVarDeclaration>();
const VarDeclaration& decl = *decls.fDecl;
const Variable& var = *decl.fVar;
- if ((!var.fModifiers.fFlags && -1 == var.fModifiers.fLayout.fBuiltin) ||
+ if ((!var.modifiers().fFlags && -1 == var.modifiers().fLayout.fBuiltin) ||
var.type().typeKind() == Type::TypeKind::kSampler) {
if (var.type().typeKind() == Type::TypeKind::kSampler) {
// Samplers are represented as a "texture/sampler" duo in the global struct.
@@ -1638,7 +1638,7 @@
break;
case ProgramElement::Kind::kGlobalVar: {
const VarDeclaration& decl = *e.as<GlobalVarDeclaration>().fDecl;
- int builtin = decl.fVar->fModifiers.fLayout.fBuiltin;
+ int builtin = decl.fVar->modifiers().fLayout.fBuiltin;
if (-1 == builtin) {
// normal var
this->writeVarDeclaration(decl, true);
@@ -1716,15 +1716,16 @@
}
case Expression::Kind::kVariableReference: {
const VariableReference& v = e->as<VariableReference>();
+ const Modifiers& modifiers = v.fVariable->modifiers();
Requirements result = kNo_Requirements;
- if (v.fVariable->fModifiers.fLayout.fBuiltin == SK_FRAGCOORD_BUILTIN) {
+ if (modifiers.fLayout.fBuiltin == SK_FRAGCOORD_BUILTIN) {
result = kGlobals_Requirement | kFragCoord_Requirement;
- } else if (Variable::kGlobal_Storage == v.fVariable->fStorage) {
- if (v.fVariable->fModifiers.fFlags & Modifiers::kIn_Flag) {
+ } else if (Variable::kGlobal_Storage == v.fVariable->storage()) {
+ if (modifiers.fFlags & Modifiers::kIn_Flag) {
result = kInputs_Requirement;
- } else if (v.fVariable->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ } else if (modifiers.fFlags & Modifiers::kOut_Flag) {
result = kOutputs_Requirement;
- } else if (v.fVariable->fModifiers.fFlags & Modifiers::kUniform_Flag &&
+ } else if (modifiers.fFlags & Modifiers::kUniform_Flag &&
v.fVariable->type().typeKind() != Type::TypeKind::kSampler) {
result = kUniforms_Requirement;
} else {