[sksl] Add SK_POINTSIZE_BUILTIN constant
GLSL, Metal, and WGSL code generators now determine the sk_PointSize
builtin by modifier value instead of by name. Also updated GLSL code
generator to use SK_POSITION_BUILTIN when processing sk_Position.
Change-Id: I57418f66786dd2bac8c4a7d8c34f83221daf505c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/541719
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Arman Uguray <armansito@google.com>
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index eb20bdf..e1a6450 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -40,6 +40,7 @@
#define SK_VERTEXID_BUILTIN 42
#define SK_INSTANCEID_BUILTIN 43
#define SK_POSITION_BUILTIN 0
+#define SK_POINTSIZE_BUILTIN 1
class SkSLCompileBench;
diff --git a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
index ac6d6b1..e7e75c6 100644
--- a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
@@ -61,7 +61,6 @@
#include "src/sksl/spirv.h"
#include <memory>
-#include <type_traits>
#include <vector>
namespace SkSL {
@@ -853,7 +852,8 @@
}
bool is_sk_position(const FieldAccess& f) {
- return "sk_Position" == f.base()->type().fields()[f.fieldIndex()].fName;
+ return f.base()->type().fields()[f.fieldIndex()].fModifiers.fLayout.fBuiltin ==
+ SK_POSITION_BUILTIN;
}
void GLSLCodeGenerator::writeFieldAccess(const FieldAccess& f) {
@@ -862,10 +862,10 @@
this->write(".");
}
const Type& baseType = f.base()->type();
- std::string_view name = baseType.fields()[f.fieldIndex()].fName;
- if (name == "sk_Position") {
+ int builtin = baseType.fields()[f.fieldIndex()].fModifiers.fLayout.fBuiltin;
+ if (builtin == SK_POSITION_BUILTIN) {
this->write("gl_Position");
- } else if (name == "sk_PointSize") {
+ } else if (builtin == SK_POINTSIZE_BUILTIN) {
this->write("gl_PointSize");
} else {
this->write(baseType.fields()[f.fieldIndex()].fName);
diff --git a/src/sksl/codegen/SkSLMetalCodeGenerator.cpp b/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
index 63d2a9b..6df6934 100644
--- a/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
@@ -1416,17 +1416,16 @@
case SK_POSITION_BUILTIN:
this->write("_out.sk_Position");
break;
+ case SK_POINTSIZE_BUILTIN:
+ this->write("_out.sk_PointSize");
+ break;
default:
- if (field->fName == "sk_PointSize") {
- this->write("_out.sk_PointSize");
- } else {
- if (FieldAccess::OwnerKind::kAnonymousInterfaceBlock == f.ownerKind()) {
- this->write("_globals.");
- this->write(fInterfaceBlockNameMap[fInterfaceBlockMap[field]]);
- this->write("->");
- }
- this->writeName(field->fName);
+ if (FieldAccess::OwnerKind::kAnonymousInterfaceBlock == f.ownerKind()) {
+ this->write("_globals.");
+ this->write(fInterfaceBlockNameMap[fInterfaceBlockMap[field]]);
+ this->write("->");
}
+ this->writeName(field->fName);
}
}
diff --git a/src/sksl/codegen/SkSLWGSLCodeGenerator.cpp b/src/sksl/codegen/SkSLWGSLCodeGenerator.cpp
index 72e3af7..da962ba 100644
--- a/src/sksl/codegen/SkSLWGSLCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLWGSLCodeGenerator.cpp
@@ -819,7 +819,8 @@
const Variable& v = *f.base()->as<VariableReference>().variable();
if (v.modifiers().fFlags & Modifiers::kIn_Flag) {
this->write("_stageIn.");
- } else if (v.modifiers().fFlags & Modifiers::kOut_Flag && field->fName != "sk_PointSize") {
+ } else if (v.modifiers().fFlags & Modifiers::kOut_Flag &&
+ field->fModifiers.fLayout.fBuiltin != SK_POINTSIZE_BUILTIN) {
this->write("(*_stageOut).");
} else {
// TODO(skia:13902): Reference the variable using the base name used for its
@@ -1048,7 +1049,7 @@
f.fModifiers, *f.fType, f.fName, Delimiter::kComma);
if (f.fModifiers.fLayout.fBuiltin == SK_POSITION_BUILTIN) {
declaredPositionBuiltin = true;
- } else if (f.fName == "sk_PointSize") {
+ } else if (f.fModifiers.fLayout.fBuiltin == SK_POINTSIZE_BUILTIN) {
// sk_PointSize is explicitly not supported by `builtin_from_sksl_name` so
// writePipelineIODeclaration will never write it. We mark it here if the
// declaration is needed so we can synthesize it below.