1 /* 2 * Copyright 2021 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SKSL_BUILTIN_TYPES 9 #define SKSL_BUILTIN_TYPES 10 11 #include <memory> 12 13 #include "src/sksl/ir/SkSLType.h" 14 15 namespace SkSL { 16 17 /** 18 * Contains the built-in, core types for SkSL. 19 */ 20 class BuiltinTypes { 21 public: 22 BuiltinTypes(); 23 24 const std::unique_ptr<Type> fFloat; 25 const std::unique_ptr<Type> fFloat2; 26 const std::unique_ptr<Type> fFloat3; 27 const std::unique_ptr<Type> fFloat4; 28 29 const std::unique_ptr<Type> fHalf; 30 const std::unique_ptr<Type> fHalf2; 31 const std::unique_ptr<Type> fHalf3; 32 const std::unique_ptr<Type> fHalf4; 33 34 const std::unique_ptr<Type> fInt; 35 const std::unique_ptr<Type> fInt2; 36 const std::unique_ptr<Type> fInt3; 37 const std::unique_ptr<Type> fInt4; 38 39 const std::unique_ptr<Type> fUInt; 40 const std::unique_ptr<Type> fUInt2; 41 const std::unique_ptr<Type> fUInt3; 42 const std::unique_ptr<Type> fUInt4; 43 44 const std::unique_ptr<Type> fShort; 45 const std::unique_ptr<Type> fShort2; 46 const std::unique_ptr<Type> fShort3; 47 const std::unique_ptr<Type> fShort4; 48 49 const std::unique_ptr<Type> fUShort; 50 const std::unique_ptr<Type> fUShort2; 51 const std::unique_ptr<Type> fUShort3; 52 const std::unique_ptr<Type> fUShort4; 53 54 const std::unique_ptr<Type> fBool; 55 const std::unique_ptr<Type> fBool2; 56 const std::unique_ptr<Type> fBool3; 57 const std::unique_ptr<Type> fBool4; 58 59 const std::unique_ptr<Type> fInvalid; 60 const std::unique_ptr<Type> fVoid; 61 const std::unique_ptr<Type> fFloatLiteral; 62 const std::unique_ptr<Type> fIntLiteral; 63 64 const std::unique_ptr<Type> fFloat2x2; 65 const std::unique_ptr<Type> fFloat2x3; 66 const std::unique_ptr<Type> fFloat2x4; 67 const std::unique_ptr<Type> fFloat3x2; 68 const std::unique_ptr<Type> fFloat3x3; 69 const std::unique_ptr<Type> fFloat3x4; 70 const std::unique_ptr<Type> fFloat4x2; 71 const std::unique_ptr<Type> fFloat4x3; 72 const std::unique_ptr<Type> fFloat4x4; 73 74 const std::unique_ptr<Type> fHalf2x2; 75 const std::unique_ptr<Type> fHalf2x3; 76 const std::unique_ptr<Type> fHalf2x4; 77 const std::unique_ptr<Type> fHalf3x2; 78 const std::unique_ptr<Type> fHalf3x3; 79 const std::unique_ptr<Type> fHalf3x4; 80 const std::unique_ptr<Type> fHalf4x2; 81 const std::unique_ptr<Type> fHalf4x3; 82 const std::unique_ptr<Type> fHalf4x4; 83 84 const std::unique_ptr<Type> fTexture1D; 85 const std::unique_ptr<Type> fTexture2D; 86 const std::unique_ptr<Type> fTexture3D; 87 const std::unique_ptr<Type> fTextureExternalOES; 88 const std::unique_ptr<Type> fTextureCube; 89 const std::unique_ptr<Type> fTexture2DRect; 90 const std::unique_ptr<Type> fITexture2D; 91 92 const std::unique_ptr<Type> fSampler1D; 93 const std::unique_ptr<Type> fSampler2D; 94 const std::unique_ptr<Type> fSampler3D; 95 const std::unique_ptr<Type> fSamplerExternalOES; 96 const std::unique_ptr<Type> fSampler2DRect; 97 98 const std::unique_ptr<Type> fISampler2D; 99 const std::unique_ptr<Type> fSampler; 100 101 const std::unique_ptr<Type> fSubpassInput; 102 const std::unique_ptr<Type> fSubpassInputMS; 103 104 const std::unique_ptr<Type> fGenType; 105 const std::unique_ptr<Type> fGenHType; 106 const std::unique_ptr<Type> fGenIType; 107 const std::unique_ptr<Type> fGenUType; 108 const std::unique_ptr<Type> fGenBType; 109 110 const std::unique_ptr<Type> fMat; 111 const std::unique_ptr<Type> fHMat; 112 const std::unique_ptr<Type> fSquareMat; 113 const std::unique_ptr<Type> fSquareHMat; 114 115 const std::unique_ptr<Type> fVec; 116 117 const std::unique_ptr<Type> fHVec; 118 const std::unique_ptr<Type> fDVec; 119 const std::unique_ptr<Type> fIVec; 120 const std::unique_ptr<Type> fUVec; 121 const std::unique_ptr<Type> fSVec; 122 const std::unique_ptr<Type> fUSVec; 123 const std::unique_ptr<Type> fByteVec; 124 const std::unique_ptr<Type> fUByteVec; 125 126 const std::unique_ptr<Type> fBVec; 127 128 const std::unique_ptr<Type> fSkCaps; 129 const std::unique_ptr<Type> fFragmentProcessor; 130 131 const std::unique_ptr<Type> fColorFilter; 132 const std::unique_ptr<Type> fShader; 133 134 private: 135 static std::unique_ptr<Type> MakeScalarType(const char* name, const char* abbrev, 136 Type::NumberKind numberKind, int priority, 137 bool highPrecision = false); 138 static std::unique_ptr<Type> MakeLiteralType(const char* name, const Type& scalarType, 139 int priority); 140 static std::unique_ptr<Type> MakeVectorType(const char* name, const char* abbrev, 141 const Type& componentType, int columns); 142 static std::unique_ptr<Type> MakeGenericType(const char* name, std::vector<const Type*> types); 143 static std::unique_ptr<Type> MakeMatrixType(const char* name, const char* abbrev, 144 const Type& componentType, int columns, int rows); 145 static std::unique_ptr<Type> MakeTextureType(const char* name, SpvDim_ dimensions, 146 bool isDepth, bool isArrayedTexture, 147 bool isMultisampled, bool isSampled); 148 static std::unique_ptr<Type> MakeSamplerType(const char* name, const Type& textureType); 149 static std::unique_ptr<Type> MakeSpecialType(const char* name, const char* abbrev, 150 Type::TypeKind typeKind); 151 }; 152 153 } // namespace SkSL 154 155 #endif 156