Blender V5.0
gpu_shader_compat_cxx.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
26
27#pragma once
28
29#include "gpu_shader_cxx_builtin.hh" // IWYU pragma: export
30#include "gpu_shader_cxx_global.hh" // IWYU pragma: export
31#include "gpu_shader_cxx_image.hh" // IWYU pragma: export
32#include "gpu_shader_cxx_matrix.hh" // IWYU pragma: export
33#include "gpu_shader_cxx_sampler.hh" // IWYU pragma: export
34#include "gpu_shader_cxx_vector.hh" // IWYU pragma: export
35
36#define assert(assertion)
37#define printf(...)
38
39/* -------------------------------------------------------------------- */
42
43/* Note: Cannot easily mutate them. Pass every by copy for now. */
44
45/* Pass argument by reference. */
46#define inout
47/* Pass argument by reference but only write to it. Its initial value is undefined. */
48#define out
49/* Pass argument by copy (default). */
50#define in
51
52/* Decorate a variable in global scope that is common to all threads in a thread-group. */
53#define shared
54
56
57/* -------------------------------------------------------------------- */
60
61/* Array syntax compatibility. */
62/* clang-format off */
63#define float_array(...) { __VA_ARGS__ }
64#define float2_array(...) { __VA_ARGS__ }
65#define float3_array(...) { __VA_ARGS__ }
66#define float4_array(...) { __VA_ARGS__ }
67#define int_array(...) { __VA_ARGS__ }
68#define int2_array(...) { __VA_ARGS__ }
69#define int3_array(...) { __VA_ARGS__ }
70#define int4_array(...) { __VA_ARGS__ }
71#define uint_array(...) { __VA_ARGS__ }
72#define uint2_array(...) { __VA_ARGS__ }
73#define uint3_array(...) { __VA_ARGS__ }
74#define uint4_array(...) { __VA_ARGS__ }
75#define bool_array(...) { __VA_ARGS__ }
76#define bool2_array(...) { __VA_ARGS__ }
77#define bool3_array(...) { __VA_ARGS__ }
78#define bool4_array(...) { __VA_ARGS__ }
79/* clang-format on */
80
81#define METAL_CONSTRUCTOR_1(class_name, t1, m1) \
82 class_name() = default; \
83 class_name(t1 m1##_) : m1(m1##_){};
84
85#define METAL_CONSTRUCTOR_2(class_name, t1, m1, t2, m2) \
86 class_name() = default; \
87 class_name(t1 m1##_, t2 m2##_) : m1(m1##_), m2(m2##_){};
88
89#define METAL_CONSTRUCTOR_3(class_name, t1, m1, t2, m2, t3, m3) \
90 class_name() = default; \
91 class_name(t1 m1##_, t2 m2##_, t3 m3##_) : m1(m1##_), m2(m2##_), m3(m3##_){};
92
93#define METAL_CONSTRUCTOR_4(class_name, t1, m1, t2, m2, t3, m3, t4, m4) \
94 class_name() = default; \
95 class_name(t1 m1##_, t2 m2##_, t3 m3##_, t4 m4##_) \
96 : m1(m1##_), m2(m2##_), m3(m3##_), m4(m4##_){};
97
98#define METAL_CONSTRUCTOR_5(class_name, t1, m1, t2, m2, t3, m3, t4, m4, t5, m5) \
99 class_name() = default; \
100 class_name(t1 m1##_, t2 m2##_, t3 m3##_, t4 m4##_, t5 m5##_) \
101 : m1(m1##_), m2(m2##_), m3(m3##_), m4(m4##_), m5(m5##_){};
102
103#define METAL_CONSTRUCTOR_6(class_name, t1, m1, t2, m2, t3, m3, t4, m4, t5, m5, t6, m6) \
104 class_name() = default; \
105 class_name(t1 m1##_, t2 m2##_, t3 m3##_, t4 m4##_, t5 m5##_, t6 m6##_) \
106 : m1(m1##_), m2(m2##_), m3(m3##_), m4(m4##_), m5(m5##_), m6(m6##_){};
107
108#define METAL_CONSTRUCTOR_7(class_name, t1, m1, t2, m2, t3, m3, t4, m4, t5, m5, t6, m6, t7, m7) \
109 class_name() = default; \
110 class_name(t1 m1##_, t2 m2##_, t3 m3##_, t4 m4##_, t5 m5##_, t6 m6##_, t7 m7##_) \
111 : m1(m1##_), m2(m2##_), m3(m3##_), m4(m4##_), m5(m5##_), m6(m6##_), m7(m7##_){};
112
114
115/* Use to suppress `-Wimplicit-fallthrough` (in place of `break`). */
116#ifndef ATTR_FALLTHROUGH
117# ifdef __GNUC__
118# define ATTR_FALLTHROUGH __attribute__((fallthrough))
119# else
120# define ATTR_FALLTHROUGH ((void)0)
121# endif
122#endif
123
124/* GLSL main function must return void. C++ need to return int.
125 * Inject real main (C++) inside the GLSL main definition. */
126#define main() \
127 /* Fake main prototype. */ \
128 /* void */ _fake_main(); \
129 /* Real main. */ \
130 int main() \
131 { \
132 _fake_main(); \
133 return 0; \
134 } \
135 /* Fake main definition. */ \
136 void _fake_main()
137
138#define GLSL_CPP_STUBS
139#ifndef GPU_SHADER
140# define GPU_SHADER
141#endif
142
143/* List of reserved keywords in GLSL. */
144#define common common_is_reserved_glsl_keyword_do_not_use
145#define partition partition_is_reserved_glsl_keyword_do_not_use
146#define active active_is_reserved_glsl_keyword_do_not_use
147// #define class /* Supported. */
148#define union union_is_reserved_glsl_keyword_do_not_use
149// #define enum /* Supported. */
150#define typedef typedef_is_reserved_glsl_keyword_do_not_use
151// #define template /* Needed for Stubs. */
152// #define this /* Needed for Stubs. */
153#define packed packed_is_reserved_glsl_keyword_do_not_use
154#define resource resource_is_reserved_glsl_keyword_do_not_use
155#define goto goto_is_reserved_glsl_keyword_do_not_use
156// #define inline /* Supported. */
157#define noinline noinline_is_reserved_glsl_keyword_do_not_use
158// #define public /* Supported. */
159// #define private /* Supported. */
160// #define static /* Supported. */
161// #define extern /* Needed for Stubs. */
162#define external external_is_reserved_glsl_keyword_do_not_use
163#define interface interface_is_reserved_glsl_keyword_do_not_use
164#define long long_is_reserved_glsl_keyword_do_not_use
165// #define short /* Supported. */
166// #define half /* Supported. */
167#define fixed fixed_is_reserved_glsl_keyword_do_not_use
168#define unsigned unsigned_is_reserved_glsl_keyword_do_not_use
169#define superp superp_is_reserved_glsl_keyword_do_not_use
170#define input input_is_reserved_glsl_keyword_do_not_use
171#define output output_is_reserved_glsl_keyword_do_not_use
172#define hvec2 hvec2_is_reserved_glsl_keyword_do_not_use
173#define hvec3 hvec3_is_reserved_glsl_keyword_do_not_use
174#define hvec4 hvec4_is_reserved_glsl_keyword_do_not_use
175#define fvec2 fvec2_is_reserved_glsl_keyword_do_not_use
176#define fvec3 fvec3_is_reserved_glsl_keyword_do_not_use
177#define fvec4 fvec4_is_reserved_glsl_keyword_do_not_use
178#define sampler3DRect sampler3DRect_is_reserved_glsl_keyword_do_not_use
179#define filter filter_is_reserved_glsl_keyword_do_not_use
180#define sizeof sizeof_is_reserved_glsl_keyword_do_not_use
181#define cast cast_is_reserved_glsl_keyword_do_not_use
182// #define namespace /* Needed for Stubs. */
183// #define using /* Needed for Stubs. */
184#define row_major row_major_is_reserved_glsl_keyword_do_not_use
185
186#ifdef GPU_SHADER_LIBRARY
187# define GPU_VERTEX_SHADER
188# define GPU_FRAGMENT_SHADER
189# define GPU_COMPUTE_SHADER
190#endif
191
192/* Resource accessor. */
193#define specialization_constant_get(create_info, _res) create_info::_res
194#define shared_variable_get(create_info, _res) create_info::_res
195#define push_constant_get(create_info, _res) create_info::_res
196#define interface_get(create_info, _res) create_info::_res
197#define attribute_get(create_info, _res) create_info::_res
198#define buffer_get(create_info, _res) create_info::_res
199#define sampler_get(create_info, _res) create_info::_res
200#define image_get(create_info, _res) create_info::_res
201
203
204#ifdef __GNUC__
205/* Avoid warnings caused by our own unroll attributes. */
206# ifdef __clang__
207# pragma GCC diagnostic ignored "-Wunknown-attributes"
208# else
209# pragma GCC diagnostic ignored "-Wattributes"
210# endif
211#endif