Blender V5.0
gpu_shader_cxx_vector.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#pragma once
12
13#include <type_traits>
14
15/* Some compilers complain about lack of return values. Keep it short. */
16#define RET \
17 { \
18 return {}; \
19 }
20
21/* -------------------------------------------------------------------- */
24
25template<typename T, int Sz> struct VecBase {};
26
27template<typename T, int Sz> struct VecOp {
29
30 const T &operator[](int) const
31 {
32 return *reinterpret_cast<const T *>(this);
33 }
35 {
36 return *reinterpret_cast<T *>(this);
37 }
38
39#define STD_OP \
40 template<typename U = T, typename std::enable_if_t<!std::is_same_v<bool, U>> * = nullptr>
41
43 STD_OP VecT operator-() const RET;
44
45 STD_OP friend VecT operator+(VecT, VecT) RET;
46 STD_OP friend VecT operator-(VecT, VecT) RET;
47 STD_OP friend VecT operator/(VecT, VecT) RET;
48 STD_OP friend VecT operator*(VecT, VecT) RET;
49
50 STD_OP friend VecT operator+(VecT, T) RET;
51 STD_OP friend VecT operator-(VecT, T) RET;
52 STD_OP friend VecT operator/(VecT, T) RET;
53 STD_OP friend VecT operator*(VecT, T) RET;
54
55 STD_OP friend VecT operator+(T, VecT) RET;
56 STD_OP friend VecT operator-(T, VecT) RET;
57 STD_OP friend VecT operator/(T, VecT) RET;
58 STD_OP friend VecT operator*(T, VecT) RET;
59
60 STD_OP friend VecT operator+=(VecT, VecT) RET;
61 STD_OP friend VecT operator-=(VecT, VecT) RET;
62 STD_OP friend VecT operator/=(VecT, VecT) RET;
63 STD_OP friend VecT operator*=(VecT, VecT) RET;
64
65 STD_OP friend VecT operator+=(VecT, T) RET;
66 STD_OP friend VecT operator-=(VecT, T) RET;
67 STD_OP friend VecT operator/=(VecT, T) RET;
68 STD_OP friend VecT operator*=(VecT, T) RET;
69
70#define INT_OP \
71 template<typename U = T, \
72 typename std::enable_if_t<std::is_integral_v<U>> * = nullptr, \
73 typename std::enable_if_t<!std::is_same_v<bool, U>> * = nullptr>
74
76
81
86
91
96
101
106
111
116
117#undef INT_OP
118};
119
120template<typename T, int Sz> struct SwizzleBase : VecOp<T, Sz> {
122
123 SwizzleBase() = default;
125
126 constexpr VecT operator=(const VecT &) RET;
127 operator VecT() const RET;
128};
129
130#define SWIZZLE_XY(T) \
131 SwizzleBase<T, 2> xx, xy, yx, yy; \
132 SwizzleBase<T, 3> xxx, xxy, xyx, xyy, yxx, yxy, yyx, yyy; \
133 SwizzleBase<T, 4> xxxx, xxxy, xxyx, xxyy, xyxx, xyxy, xyyx, xyyy, yxxx, yxxy, yxyx, yxyy, yyxx, \
134 yyxy, yyyx, yyyy;
135
136#define SWIZZLE_RG(T) \
137 SwizzleBase<T, 2> rr, rg, gr, gg; \
138 SwizzleBase<T, 3> rrr, rrg, rgr, rgg, grr, grg, ggr, ggg; \
139 SwizzleBase<T, 4> rrrr, rrrg, rrgr, rrgg, rgrr, rgrg, rggr, rggg, grrr, grrg, grgr, grgg, ggrr, \
140 ggrg, gggr, gggg;
141
142#define SWIZZLE_XYZ(T) \
143 SWIZZLE_XY(T) \
144 SwizzleBase<T, 2> xz, yz, zx, zy, zz; \
145 SwizzleBase<T, 3> xxz, xyz, xzx, xzy, xzz, yxz, yyz, yzx, yzy, yzz, zxx, zxy, zxz, zyx, zyy, \
146 zyz, zzx, zzy, zzz; \
147 SwizzleBase<T, 4> xxxz, xxyz, xxzx, xxzy, xxzz, xyxz, xyyz, xyzx, xyzy, xyzz, xzxx, xzxy, xzxz, \
148 xzyx, xzyy, xzyz, xzzx, xzzy, xzzz, yxxz, yxyz, yxzx, yxzy, yxzz, yyxz, yyyz, yyzx, yyzy, \
149 yyzz, yzxx, yzxy, yzxz, yzyx, yzyy, yzyz, yzzx, yzzy, yzzz, zxxx, zxxy, zxxz, zxyx, zxyy, \
150 zxyz, zxzx, zxzy, zxzz, zyxx, zyxy, zyxz, zyyx, zyyy, zyyz, zyzx, zyzy, zyzz, zzxx, zzxy, \
151 zzxz, zzyx, zzyy, zzyz, zzzx, zzzy, zzzz;
152
153#define SWIZZLE_RGB(T) \
154 SWIZZLE_RG(T) \
155 SwizzleBase<T, 2> rb, gb, br, bg, bb; \
156 SwizzleBase<T, 3> rrb, rgb, rbr, rbg, rbb, grb, ggb, gbr, gbg, gbb, brr, brg, brb, bgr, bgg, \
157 bgb, bbr, bbg, bbb; \
158 SwizzleBase<T, 4> rrrb, rrgb, rrbr, rrbg, rrbb, rgrb, rggb, rgbr, rgbg, rgbb, rbrr, rbrg, rbrb, \
159 rbgr, rbgg, rbgb, rbbr, rbbg, rbbb, grrb, grgb, grbr, grbg, grbb, ggrb, gggb, ggbr, ggbg, \
160 ggbb, gbrr, gbrg, gbrb, gbgr, gbgg, gbgb, gbbr, gbbg, gbbb, brrr, brrg, brrb, brgr, brgg, \
161 brgb, brbr, brbg, brbb, bgrr, bgrg, bgrb, bggr, bggg, bggb, bgbr, bgbg, bgbb, bbrr, bbrg, \
162 bbrb, bbgr, bbgg, bbgb, bbbr, bbbg, bbbb;
163
164#define SWIZZLE_XYZW(T) \
165 SWIZZLE_XYZ(T) \
166 SwizzleBase<T, 2> xw, yw, zw, wx, wy, wz, ww; \
167 SwizzleBase<T, 3> xxw, xyw, xzw, xwx, xwy, xwz, xww, yxw, yyw, yzw, ywx, ywy, ywz, yww, zxw, \
168 zyw, zzw, zwx, zwy, zwz, zww, wxx, wxy, wxz, wxw, wyx, wyy, wyz, wyw, wzx, wzy, wzz, wzw, \
169 wwx, wwy, wwz, www; \
170 SwizzleBase<T, 4> xxxw, xxyw, xxzw, xxwx, xxwy, xxwz, xxww, xyxw, xyyw, xyzw, xywx, xywy, xywz, \
171 xyww, xzxw, xzyw, xzzw, xzwx, xzwy, xzwz, xzww, xwxx, xwxy, xwxz, xwxw, xwyx, xwyy, xwyz, \
172 xwyw, xwzx, xwzy, xwzz, xwzw, xwwx, xwwy, xwwz, xwww, yxxw, yxyw, yxzw, yxwx, yxwy, yxwz, \
173 yxww, yyxw, yyyw, yyzw, yywx, yywy, yywz, yyww, yzxw, yzyw, yzzw, yzwx, yzwy, yzwz, yzww, \
174 ywxx, ywxy, ywxz, ywxw, ywyx, ywyy, ywyz, ywyw, ywzx, ywzy, ywzz, ywzw, ywwx, ywwy, ywwz, \
175 ywww, zxxw, zxyw, zxzw, zxwx, zxwy, zxwz, zxww, zyxw, zyyw, zyzw, zywx, zywy, zywz, zyww, \
176 zzxw, zzyw, zzzw, zzwx, zzwy, zzwz, zzww, zwxx, zwxy, zwxz, zwxw, zwyx, zwyy, zwyz, zwyw, \
177 zwzx, zwzy, zwzz, zwzw, zwwx, zwwy, zwwz, zwww, wxxx, wxxy, wxxz, wxxw, wxyx, wxyy, wxyz, \
178 wxyw, wxzx, wxzy, wxzz, wxzw, wxwx, wxwy, wxwz, wxww, wyxx, wyxy, wyxz, wyxw, wyyx, wyyy, \
179 wyyz, wyyw, wyzx, wyzy, wyzz, wyzw, wywx, wywy, wywz, wyww, wzxx, wzxy, wzxz, wzxw, wzyx, \
180 wzyy, wzyz, wzyw, wzzx, wzzy, wzzz, wzzw, wzwx, wzwy, wzwz, wzww, wwxx, wwxy, wwxz, wwxw, \
181 wwyx, wwyy, wwyz, wwyw, wwzx, wwzy, wwzz, wwzw, wwwx, wwwy, wwwz, wwww;
182
183#define SWIZZLE_RGBA(T) \
184 SWIZZLE_RGB(T) \
185 SwizzleBase<T, 2> ra, ga, ba, ar, ag, ab, aa; \
186 SwizzleBase<T, 3> rra, rga, rba, rar, rag, rab, raa, gra, gga, gba, gar, gag, gab, gaa, bra, \
187 bga, bba, bar, bag, bab, baa, arr, arg, arb, ara, agr, agg, agb, aga, abr, abg, abb, aba, \
188 aar, aag, aab, aaa; \
189 SwizzleBase<T, 4> rrra, rrga, rrba, rrar, rrag, rrab, rraa, rgra, rgga, rgba, rgar, rgag, rgab, \
190 rgaa, rbra, rbga, rbba, rbar, rbag, rbab, rbaa, rarr, rarg, rarb, rara, ragr, ragg, ragb, \
191 raga, rabr, rabg, rabb, raba, raar, raag, raab, raaa, grra, grga, grba, grar, grag, grab, \
192 graa, ggra, ggga, ggba, ggar, ggag, ggab, ggaa, gbra, gbga, gbba, gbar, gbag, gbab, gbaa, \
193 garr, garg, garb, gara, gagr, gagg, gagb, gaga, gabr, gabg, gabb, gaba, gaar, gaag, gaab, \
194 gaaa, brra, brga, brba, brar, brag, brab, braa, bgra, bgga, bgba, bgar, bgag, bgab, bgaa, \
195 bbra, bbga, bbba, bbar, bbag, bbab, bbaa, barr, barg, barb, bara, bagr, bagg, bagb, baga, \
196 babr, babg, babb, baba, baar, baag, baab, baaa, arrr, arrg, arrb, arra, argr, argg, argb, \
197 arga, arbr, arbg, arbb, arba, arar, arag, arab, araa, agrr, agrg, agrb, agra, aggr, aggg, \
198 aggb, agga, agbr, agbg, agbb, agba, agar, agag, agab, agaa, abrr, abrg, abrb, abra, abgr, \
199 abgg, abgb, abga, abbr, abbg, abbb, abba, abar, abag, abab, abaa, aarr, aarg, aarb, aara, \
200 aagr, aagg, aagb, aaga, aabr, aabg, aabb, aaba, aaar, aaag, aaab, aaaa;
201
202template<typename T> struct VecBase<T, 1> {
203 VecBase() = default;
204 template<typename U> explicit VecBase(VecOp<U, 1>) {}
206
207 operator T() RET;
208};
209
210template<typename T> struct VecBase<T, 2> : VecOp<T, 2> {
211 private:
212 /* Weird non-zero value to avoid error about division by zero in constexpr. */
213 static constexpr T V = T(0.123f);
214
215 public:
216 union {
217 struct {
218 T x, y;
219 };
220 struct {
221 T r, g;
222 };
223 SWIZZLE_XY(T);
224 SWIZZLE_RG(T);
225 };
226
227 VecBase() = default;
228 template<typename U> explicit VecBase(VecOp<U, 2>) {}
229 constexpr explicit VecBase(T) : x(V), y(V) {}
230 /* Implemented correctly for GCC to compile the constexpr float2 arrays. */
231 constexpr explicit VecBase(T x_, T y_) : x(x_), y(y_) {}
232};
233
234template<typename T> struct VecBase<T, 3> : VecOp<T, 3> {
235 private:
236 /* Weird non-zero value to avoid error about division by zero in constexpr. */
237 static constexpr T V = T(0.123f);
238
239 public:
240 union {
241 struct {
242 T x, y, z;
243 };
244 struct {
245 T r, g, b;
246 };
247 SWIZZLE_XYZ(T);
248 SWIZZLE_RGB(T);
249 };
250
251 VecBase() = default;
252 template<typename U> explicit VecBase(VecOp<U, 3>) {}
253 constexpr explicit VecBase(T) : x(V), y(V), z(V) {}
254 /* Implemented correctly for GCC to compile the constexpr gl_WorkGroupSize. */
255 constexpr explicit VecBase(T x_, T y_, T z_) : x(x_), y(y_), z(z_) {}
256 constexpr explicit VecBase(VecOp<T, 2>, T) : x(V), y(V), z(V) {}
257 constexpr explicit VecBase(T, VecOp<T, 2>) : x(V), y(V), z(V) {}
258};
259
260template<typename T> struct VecBase<T, 4> : VecOp<T, 4> {
261 private:
262 /* Weird non-zero value to avoid error about division by zero in constexpr. */
263 static constexpr T V = T(0.123f);
264
265 public:
266 union {
267 struct {
268 T x, y, z, w;
269 };
270 struct {
271 T r, g, b, a;
272 };
275 };
276
277 VecBase() = default;
278 template<typename U> explicit VecBase(VecOp<U, 4>) {}
279 constexpr explicit VecBase(T) : x(V), y(V), z(V), w(V) {}
280 /* Implemented correctly for GCC to compile the constexpr. */
281 constexpr explicit VecBase(T x_, T y_, T z_, T w_) : x(x_), y(y_), z(z_), w(w_) {}
282 constexpr explicit VecBase(VecOp<T, 2>, T, T) : x(V), y(V), z(V), w(V) {}
283 constexpr explicit VecBase(T, VecOp<T, 2>, T) : x(V), y(V), z(V), w(V) {}
284 constexpr explicit VecBase(T, T, VecOp<T, 2>) : x(V), y(V), z(V), w(V) {}
285 constexpr explicit VecBase(VecOp<T, 2>, VecOp<T, 2>) : x(V), y(V), z(V), w(V) {}
286 constexpr explicit VecBase(VecOp<T, 3>, T) : x(V), y(V), z(V), w(V) {}
287 constexpr explicit VecBase(T, VecOp<T, 3>) : x(V), y(V), z(V), w(V) {}
288};
289
290/* Boolean vectors do not have operators and are not convertible from other types. */
291
292template<> struct VecBase<bool, 2> : VecOp<bool, 2> {
293 union {
294 struct {
295 bool x, y;
296 };
297 SWIZZLE_XY(bool);
298 };
299
300 VecBase() = default;
301 explicit VecBase(bool) {}
302 explicit VecBase(bool, bool) {}
303 /* Should be forbidden, but is used by SMAA. */
305};
306
307template<> struct VecBase<bool, 3> : VecOp<bool, 3> {
308 union {
309 struct {
310 bool x, y, z;
311 };
312 SWIZZLE_XYZ(bool);
313 };
314
315 VecBase() = default;
316 explicit VecBase(bool) {}
317 explicit VecBase(bool, bool, bool) {}
318 explicit VecBase(VecOp<bool, 2>, bool) {}
319 explicit VecBase(bool, VecOp<bool, 2>) {}
320};
321
322template<> struct VecBase<bool, 4> : VecOp<bool, 4> {
323 union {
324 struct {
325 bool x, y, z, w;
326 };
327 SWIZZLE_XYZW(bool);
328 };
329
330 VecBase() = default;
331 explicit VecBase(bool) {}
332 explicit VecBase(bool, bool, bool, bool) {}
333 explicit VecBase(VecOp<bool, 2>, bool, bool) {}
334 explicit VecBase(bool, VecOp<bool, 2>, bool) {}
335 explicit VecBase(bool, bool, VecOp<bool, 2>) {}
337 explicit VecBase(VecOp<bool, 3>, bool) {}
338 explicit VecBase(bool, VecOp<bool, 3>) {}
339};
340
341using uint = unsigned int;
342using uint32_t = unsigned int; /* For typed enums. */
343
347
351
355
356using uchar = unsigned int;
360
364
365using ushort = unsigned short;
369
373
374using half = float;
378
382
384
395
397
398#undef RET
unsigned char uchar
unsigned int uint
unsigned short ushort
int32_t bool32_t
Definition half.h:41
nullptr float
int2 packed_int2
VecBase< ushort, 2 > ushort2
VecBase< short, 4 > short4
VecBase< short, 2 > short2
float2 packed_float2
#define INT_OP
VecBase< bool, 4 > bool4
VecBase< char, 3 > char3
#define SWIZZLE_RGBA(T)
VecBase< bool, 3 > bool3
uint4 packed_uint4
VecBase< ushort, 3 > ushort3
VecBase< half, 2 > half2
#define SWIZZLE_RGB(T)
float4 packed_float4
VecBase< char, 2 > char2
VecBase< short, 3 > short3
#define RET
VecBase< half, 3 > half3
VecBase< bool, 2 > bool2
int4 packed_int4
#define SWIZZLE_XYZW(T)
uint2 packed_uint2
#define SWIZZLE_XYZ(T)
VecBase< char, 4 > char4
#define SWIZZLE_RG(T)
#define STD_OP
#define SWIZZLE_XY(T)
#define T
constexpr VecT operator=(const VecT &) RET
SwizzleBase()=default
VecBase< T, Sz > VecT
VecBase()=default
VecBase()=default
constexpr VecBase(T x_, T y_)
constexpr VecBase(T, VecOp< T, 2 >)
constexpr VecBase(T x_, T y_, T z_)
VecBase()=default
constexpr VecBase(VecOp< T, 2 >, T)
constexpr VecBase(VecOp< T, 3 >, T)
constexpr VecBase(T x_, T y_, T z_, T w_)
constexpr VecBase(VecOp< T, 2 >, T, T)
VecBase()=default
constexpr VecBase(T, T, VecOp< T, 2 >)
constexpr VecBase(T, VecOp< T, 2 >, T)
constexpr VecBase(T, VecOp< T, 3 >)
constexpr VecBase(VecOp< T, 2 >, VecOp< T, 2 >)
VecBase(VecOp< float, 2 >)
VecBase(VecOp< bool, 2 >, bool)
VecBase(bool, VecOp< bool, 2 >)
VecBase(bool, bool, VecOp< bool, 2 >)
VecBase(bool, VecOp< bool, 2 >, bool)
VecBase(VecOp< bool, 2 >, VecOp< bool, 2 >)
VecBase(bool, VecOp< bool, 3 >)
VecBase(VecOp< bool, 3 >, bool)
VecBase(bool, bool, bool, bool)
VecBase(VecOp< bool, 2 >, bool, bool)
INT_OP friend VecT operator>>(VecT, VecT) RET
T & operator[](int)
INT_OP friend VecT operator<<(VecT, VecT) RET
INT_OP friend VecT operator^(VecT, VecT) RET
INT_OP friend VecT operator&(VecT, T) RET
INT_OP friend VecT operator&=(VecT, T) RET
INT_OP friend VecT operator<<=(VecT, VecT) RET
INT_OP friend VecT operator|=(VecT, T) RET
INT_OP friend VecT operator&(VecT, VecT) RET
INT_OP friend VecT operator%=(VecT, VecT) RET
INT_OP friend VecT operator>>=(VecT, VecT) RET
INT_OP friend VecT operator>>=(T, VecT) RET
INT_OP friend VecT operator<<=(VecT, T) RET
INT_OP friend VecT operator^=(VecT, VecT) RET
VecBase< T, Sz > VecT
INT_OP friend VecT operator<<(T, VecT) RET
INT_OP friend VecT operator^(T, VecT) RET
INT_OP friend VecT operator%(VecT, VecT) RET
INT_OP friend VecT operator>>(T, VecT) RET
INT_OP friend VecT operator<<(VecT, T) RET
INT_OP friend VecT operator|(T, VecT) RET
INT_OP friend VecT operator^(VecT, T) RET
STD_OP VecT operator+() const RET
INT_OP friend VecT operator&(T, VecT) RET
INT_OP friend VecT operator|(VecT, T) RET
INT_OP friend VecT operator|(VecT, VecT) RET
INT_OP friend VecT operator|=(VecT, VecT) RET
const T & operator[](int) const
INT_OP friend VecT operator^=(VecT, T) RET
INT_OP friend VecT operator>>(VecT, T) RET
INT_OP friend VecT operator%(VecT, T) RET
INT_OP friend VecT operator%(T, VecT) RET
INT_OP friend VecT operator&=(VecT, VecT) RET
INT_OP friend VecT operator~(VecT) RET
INT_OP friend VecT operator>>=(VecT, T) RET
INT_OP friend VecT operator<<=(T, VecT) RET
INT_OP friend VecT operator%=(VecT, T) RET
Definition half.h:60