Use constexpr arrays to list the built-in types.

This is a step towards a followup CL which adds the private types to the
root symbol table.

Change-Id: Ieab35154aa48949fb83ea6631057c3593127bd3d
Bug: skia:12538
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/458977
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 512a401..1b18daf 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -137,49 +137,65 @@
 
 Compiler::~Compiler() {}
 
-#define TYPE(t) fContext->fTypes.f ## t .get()
+#define TYPE(t) &BuiltinTypes::f ## t
+
+using BuiltinTypePtr = const std::unique_ptr<Type> BuiltinTypes::*;
+
+inline static constexpr BuiltinTypePtr kRootTypes[] = {
+    TYPE(Void),
+
+    TYPE( Float), TYPE( Float2), TYPE( Float3), TYPE( Float4),
+    TYPE(  Half), TYPE(  Half2), TYPE(  Half3), TYPE(  Half4),
+    TYPE(   Int), TYPE(   Int2), TYPE(   Int3), TYPE(   Int4),
+    TYPE(  UInt), TYPE(  UInt2), TYPE(  UInt3), TYPE(  UInt4),
+    TYPE( Short), TYPE( Short2), TYPE( Short3), TYPE( Short4),
+    TYPE(UShort), TYPE(UShort2), TYPE(UShort3), TYPE(UShort4),
+    TYPE(  Bool), TYPE(  Bool2), TYPE(  Bool3), TYPE(  Bool4),
+
+    TYPE(Float2x2), TYPE(Float2x3), TYPE(Float2x4),
+    TYPE(Float3x2), TYPE(Float3x3), TYPE(Float3x4),
+    TYPE(Float4x2), TYPE(Float4x3), TYPE(Float4x4),
+
+    TYPE(Half2x2),  TYPE(Half2x3),  TYPE(Half2x4),
+    TYPE(Half3x2),  TYPE(Half3x3),  TYPE(Half3x4),
+    TYPE(Half4x2),  TYPE(Half4x3),  TYPE(Half4x4),
+
+    TYPE(SquareMat), TYPE(SquareHMat),
+    TYPE(Mat),       TYPE(HMat),
+
+    // TODO(skia:12349): generic short/ushort
+    TYPE(GenType),   TYPE(GenIType), TYPE(GenUType),
+    TYPE(GenHType),   /* (GenSType)      (GenUSType) */
+    TYPE(GenBType),
+
+    TYPE(Vec),     TYPE(IVec),     TYPE(UVec),
+    TYPE(HVec),    TYPE(SVec),     TYPE(USVec),
+    TYPE(BVec),
+
+    TYPE(ColorFilter),
+    TYPE(Shader),
+    TYPE(Blender),
+};
+
+inline static constexpr BuiltinTypePtr kPrivateTypes[] = {
+    TYPE(Sampler1D), TYPE(Sampler2D), TYPE(Sampler3D),
+    TYPE(SamplerExternalOES),
+    TYPE(Sampler2DRect),
+
+    TYPE(ISampler2D),
+    TYPE(SubpassInput), TYPE(SubpassInputMS),
+
+    TYPE(Sampler),
+    TYPE(Texture2D),
+};
+
+#undef TYPE
 
 std::shared_ptr<SymbolTable> Compiler::makeRootSymbolTable() {
     auto rootSymbolTable = std::make_shared<SymbolTable>(*fContext, /*builtin=*/true);
 
-    const SkSL::Symbol* rootTypes[] = {
-        TYPE(Void),
-
-        TYPE( Float), TYPE( Float2), TYPE( Float3), TYPE( Float4),
-        TYPE(  Half), TYPE(  Half2), TYPE(  Half3), TYPE(  Half4),
-        TYPE(   Int), TYPE(   Int2), TYPE(   Int3), TYPE(   Int4),
-        TYPE(  UInt), TYPE(  UInt2), TYPE(  UInt3), TYPE(  UInt4),
-        TYPE( Short), TYPE( Short2), TYPE( Short3), TYPE( Short4),
-        TYPE(UShort), TYPE(UShort2), TYPE(UShort3), TYPE(UShort4),
-        TYPE(  Bool), TYPE(  Bool2), TYPE(  Bool3), TYPE(  Bool4),
-
-        TYPE(Float2x2), TYPE(Float2x3), TYPE(Float2x4),
-        TYPE(Float3x2), TYPE(Float3x3), TYPE(Float3x4),
-        TYPE(Float4x2), TYPE(Float4x3), TYPE(Float4x4),
-
-        TYPE(Half2x2),  TYPE(Half2x3),  TYPE(Half2x4),
-        TYPE(Half3x2),  TYPE(Half3x3),  TYPE(Half3x4),
-        TYPE(Half4x2),  TYPE(Half4x3),  TYPE(Half4x4),
-
-        TYPE(SquareMat), TYPE(SquareHMat),
-        TYPE(Mat),       TYPE(HMat),
-
-        // TODO(skia:12349): generic short/ushort
-        TYPE(GenType),   TYPE(GenIType), TYPE(GenUType),
-        TYPE(GenHType),   /* (GenSType)      (GenUSType) */
-        TYPE(GenBType),
-
-        TYPE(Vec),     TYPE(IVec),     TYPE(UVec),
-        TYPE(HVec),    TYPE(SVec),     TYPE(USVec),
-        TYPE(BVec),
-
-        TYPE(ColorFilter),
-        TYPE(Shader),
-        TYPE(Blender),
-    };
-
-    for (const SkSL::Symbol* type : rootTypes) {
-        rootSymbolTable->addWithoutOwnership(type);
+    for (BuiltinTypePtr rootType : kRootTypes) {
+        rootSymbolTable->addWithoutOwnership((fContext->fTypes.*rootType).get());
     }
 
     return rootSymbolTable;
@@ -188,20 +204,8 @@
 std::shared_ptr<SymbolTable> Compiler::makePrivateSymbolTable(std::shared_ptr<SymbolTable> parent) {
     auto privateSymbolTable = std::make_shared<SymbolTable>(parent, /*builtin=*/true);
 
-    const SkSL::Symbol* privateTypes[] = {
-        TYPE(Sampler1D), TYPE(Sampler2D), TYPE(Sampler3D),
-        TYPE(SamplerExternalOES),
-        TYPE(Sampler2DRect),
-
-        TYPE(ISampler2D),
-        TYPE(SubpassInput), TYPE(SubpassInputMS),
-
-        TYPE(Sampler),
-        TYPE(Texture2D),
-    };
-
-    for (const SkSL::Symbol* type : privateTypes) {
-        privateSymbolTable->addWithoutOwnership(type);
+    for (BuiltinTypePtr privateType : kPrivateTypes) {
+        privateSymbolTable->addWithoutOwnership((fContext->fTypes.*privateType).get());
     }
 
     // sk_Caps is "builtin", but all references to it are resolved to Settings, so we don't need to
@@ -212,12 +216,9 @@
                                                        fContext->fTypes.fSkCaps.get(),
                                                        /*builtin=*/false,
                                                        Variable::Storage::kGlobal));
-
     return privateSymbolTable;
 }
 
-#undef TYPE
-
 const ParsedModule& Compiler::loadGPUModule() {
     if (!fGPUModule.fSymbols) {
         fGPUModule = this->parseModule(ProgramKind::kFragment, MODULE_DATA(gpu), fPrivateModule);