blob: 1ab29cafbf6311dff071df111ad38bd8a0385439 [file] [log] [blame]
John Stilesac01aca2021-01-15 11:12:46 -05001/*
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
15namespace SkSL {
16
17/**
18 * Contains the built-in, core types for SkSL.
19 */
John Stilese6c67c52021-01-15 12:01:00 -050020class BuiltinTypes {
21public:
John Stilesac01aca2021-01-15 11:12:46 -050022 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
John Stilesac01aca2021-01-15 11:12:46 -050054 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;
Ethan Nicholas549c6b82021-06-25 12:31:44 -040060 const std::unique_ptr<Type> fPoison;
John Stilesac01aca2021-01-15 11:12:46 -050061 const std::unique_ptr<Type> fVoid;
62 const std::unique_ptr<Type> fFloatLiteral;
63 const std::unique_ptr<Type> fIntLiteral;
64
65 const std::unique_ptr<Type> fFloat2x2;
66 const std::unique_ptr<Type> fFloat2x3;
67 const std::unique_ptr<Type> fFloat2x4;
68 const std::unique_ptr<Type> fFloat3x2;
69 const std::unique_ptr<Type> fFloat3x3;
70 const std::unique_ptr<Type> fFloat3x4;
71 const std::unique_ptr<Type> fFloat4x2;
72 const std::unique_ptr<Type> fFloat4x3;
73 const std::unique_ptr<Type> fFloat4x4;
74
75 const std::unique_ptr<Type> fHalf2x2;
76 const std::unique_ptr<Type> fHalf2x3;
77 const std::unique_ptr<Type> fHalf2x4;
78 const std::unique_ptr<Type> fHalf3x2;
79 const std::unique_ptr<Type> fHalf3x3;
80 const std::unique_ptr<Type> fHalf3x4;
81 const std::unique_ptr<Type> fHalf4x2;
82 const std::unique_ptr<Type> fHalf4x3;
83 const std::unique_ptr<Type> fHalf4x4;
84
85 const std::unique_ptr<Type> fTexture1D;
86 const std::unique_ptr<Type> fTexture2D;
87 const std::unique_ptr<Type> fTexture3D;
88 const std::unique_ptr<Type> fTextureExternalOES;
89 const std::unique_ptr<Type> fTextureCube;
90 const std::unique_ptr<Type> fTexture2DRect;
91 const std::unique_ptr<Type> fITexture2D;
92
93 const std::unique_ptr<Type> fSampler1D;
94 const std::unique_ptr<Type> fSampler2D;
95 const std::unique_ptr<Type> fSampler3D;
96 const std::unique_ptr<Type> fSamplerExternalOES;
97 const std::unique_ptr<Type> fSampler2DRect;
98
99 const std::unique_ptr<Type> fISampler2D;
100 const std::unique_ptr<Type> fSampler;
101
John Stilesac01aca2021-01-15 11:12:46 -0500102 const std::unique_ptr<Type> fSubpassInput;
103 const std::unique_ptr<Type> fSubpassInputMS;
104
105 const std::unique_ptr<Type> fGenType;
106 const std::unique_ptr<Type> fGenHType;
107 const std::unique_ptr<Type> fGenIType;
108 const std::unique_ptr<Type> fGenUType;
109 const std::unique_ptr<Type> fGenBType;
110
111 const std::unique_ptr<Type> fMat;
112 const std::unique_ptr<Type> fHMat;
113 const std::unique_ptr<Type> fSquareMat;
114 const std::unique_ptr<Type> fSquareHMat;
115
116 const std::unique_ptr<Type> fVec;
117
118 const std::unique_ptr<Type> fHVec;
119 const std::unique_ptr<Type> fDVec;
120 const std::unique_ptr<Type> fIVec;
121 const std::unique_ptr<Type> fUVec;
122 const std::unique_ptr<Type> fSVec;
123 const std::unique_ptr<Type> fUSVec;
124 const std::unique_ptr<Type> fByteVec;
125 const std::unique_ptr<Type> fUByteVec;
126
127 const std::unique_ptr<Type> fBVec;
128
129 const std::unique_ptr<Type> fSkCaps;
130 const std::unique_ptr<Type> fFragmentProcessor;
John Stilese6c67c52021-01-15 12:01:00 -0500131
Brian Osman14d00962021-04-02 17:04:35 -0400132 const std::unique_ptr<Type> fColorFilter;
133 const std::unique_ptr<Type> fShader;
134
John Stilese6c67c52021-01-15 12:01:00 -0500135private:
John Stilesce1a0882021-03-22 10:56:08 -0400136 static std::unique_ptr<Type> MakeScalarType(const char* name, const char* abbrev,
John Stiles7377afb2021-05-27 11:03:33 -0400137 Type::NumberKind numberKind, int8_t priority,
138 int8_t bitWidth);
John Stilese6c67c52021-01-15 12:01:00 -0500139 static std::unique_ptr<Type> MakeLiteralType(const char* name, const Type& scalarType,
John Stiles7377afb2021-05-27 11:03:33 -0400140 int8_t priority);
John Stilesce1a0882021-03-22 10:56:08 -0400141 static std::unique_ptr<Type> MakeVectorType(const char* name, const char* abbrev,
142 const Type& componentType, int columns);
John Stilese6c67c52021-01-15 12:01:00 -0500143 static std::unique_ptr<Type> MakeGenericType(const char* name, std::vector<const Type*> types);
John Stilesce1a0882021-03-22 10:56:08 -0400144 static std::unique_ptr<Type> MakeMatrixType(const char* name, const char* abbrev,
John Stiles7377afb2021-05-27 11:03:33 -0400145 const Type& componentType, int columns,
146 int8_t rows);
John Stilese6c67c52021-01-15 12:01:00 -0500147 static std::unique_ptr<Type> MakeTextureType(const char* name, SpvDim_ dimensions,
148 bool isDepth, bool isArrayedTexture,
149 bool isMultisampled, bool isSampled);
150 static std::unique_ptr<Type> MakeSamplerType(const char* name, const Type& textureType);
Brian Osman42de99b2021-04-02 15:28:04 -0400151 static std::unique_ptr<Type> MakeSpecialType(const char* name, const char* abbrev,
152 Type::TypeKind typeKind);
John Stilesac01aca2021-01-15 11:12:46 -0500153};
154
155} // namespace SkSL
156
157#endif