26#define DECLARE(a, b, c, blender_enum, d, e, f, g, h) blender_enum = int(DataFormat::blender_enum),
28#define GPU_VERTEX_FORMAT_EXPAND(impl) \
29 SNORM_8_8_8_8_(impl) \
32 SNORM_16_16_16_16_(impl) \
34 UNORM_8_8_8_8_(impl) \
37 UNORM_16_16_16_16_(impl) \
42 SINT_16_16_16_16_(impl) \
46 SINT_32_32_32_(impl) \
47 SINT_32_32_32_32_(impl) \
52 UINT_16_16_16_16_(impl) \
56 UINT_32_32_32_(impl) \
57 UINT_32_32_32_32_(impl) \
61 SFLOAT_32_32_32_(impl) \
62 SFLOAT_32_32_32_32_(impl) \
64 SNORM_10_10_10_2_(impl) \
65 UNORM_10_10_10_2_(impl) \
73#define DECLARE(a, b, c, blender_enum, d, e, f, g, h) \
74 blender_enum##_DEPRECATED = int(DataFormat::blender_enum),
77#define GPU_VERTEX_DEPRECATED_FORMAT_EXPAND(impl) \
82 SNORM_16_16_16_(impl) \
87 UNORM_16_16_16_(impl) \
92 SINT_16_16_16_(impl) \
105#define GPU_VERTEX_FORMAT_EXPAND_TYPED(impl) \
106 SINT_8_8_8_8_(impl) \
109 SINT_16_16_16_16_(impl) \
113 SINT_32_32_32_(impl) \
114 SINT_32_32_32_32_(impl) \
116 UINT_8_8_8_8_(impl) \
119 UINT_16_16_16_16_(impl) \
123 UINT_32_32_32_(impl) \
124 UINT_32_32_32_32_(impl) \
127 SFLOAT_32_32_(impl) \
128 SFLOAT_32_32_32_(impl) \
129 SFLOAT_32_32_32_32_(impl) \
138#define ATTR_TYPE_MAPPING(_type, b, c, blender_enum, d, e, f, g, h) \
139 template<> struct AttrType<_type> { \
140 static constexpr VertAttrType type = VertAttrType::blender_enum; \
145#undef ATTR_TYPE_MAPPING
193 return to_bytesize(to_data_format(
format));
198 return format_component_len(to_data_format(
format));
212 "We use uchar as index inside the name buffer "
213 "so GPU_VERT_ATTR_NAMES_BUF_LEN needs to be "
214 "smaller than GPUVertFormat->name_offset and "
215 "GPUVertAttr->names maximum value");
238#define GPU_VERTEX_FORMAT_ADD_ATTR(attr) \
239 format.attribute_add( \
240 #attr, blender::gpu::AttrType<decltype(attr)>::type, offsetof(VertT, attr)); \
241 BLI_STATIC_ASSERT(offsetof(VertT, attr) < 255, #attr " has offset greater than 255") \
242 BLI_STATIC_ASSERT(offsetof(VertT, attr) % 4 == 0, #attr " is not aligned to 4 bytes")
244#define _ATTR_EXPAND1(a) GPU_VERTEX_FORMAT_ADD_ATTR(a)
245#define _ATTR_EXPAND2(a, b) \
247 GPU_VERTEX_FORMAT_ADD_ATTR(b)
248#define _ATTR_EXPAND3(a, b, c) \
249 _ATTR_EXPAND2(a, b) \
250 GPU_VERTEX_FORMAT_ADD_ATTR(c)
251#define _ATTR_EXPAND4(a, b, c, d) \
252 _ATTR_EXPAND3(a, b, c) \
253 GPU_VERTEX_FORMAT_ADD_ATTR(d)
254#define _ATTR_EXPAND5(a, b, c, d, e) \
255 _ATTR_EXPAND4(a, b, c, d) \
256 GPU_VERTEX_FORMAT_ADD_ATTR(e)
257#define _ATTR_EXPAND6(a, b, c, d, e, f) \
258 _ATTR_EXPAND5(a, b, c, d, e) \
259 GPU_VERTEX_FORMAT_ADD_ATTR(f)
260#define _ATTR_EXPAND7(a, b, c, d, e, f, g) \
261 _ATTR_EXPAND6(a, b, c, d, e, f) \
262 GPU_VERTEX_FORMAT_ADD_ATTR(g)
263#define _ATTR_EXPAND8(a, b, c, d, e, f, g, h) \
264 _ATTR_EXPAND7(a, b, c, d, e, f, g) \
265 GPU_VERTEX_FORMAT_ADD_ATTR(h)
266#define _ATTR_EXPAND9(a, b, c, d, e, f, g, h, i) \
267 _ATTR_EXPAND8(a, b, c, d, e, f, g, h) \
268 GPU_VERTEX_FORMAT_ADD_ATTR(i)
269#define _ATTR_EXPAND10(a, b, c, d, e, f, g, h, i, j) \
270 _ATTR_EXPAND9(a, b, c, d, e, f, g, h, i) \
271 GPU_VERTEX_FORMAT_ADD_ATTR(j)
272#define _ATTR_EXPAND11(a, b, c, d, e, f, g, h, i, j, k) \
273 _ATTR_EXPAND10(a, b, c, d, e, f, g, h, i, j) \
274 GPU_VERTEX_FORMAT_ADD_ATTR(k)
275#define _ATTR_EXPAND12(a, b, c, d, e, f, g, h, i, j, k, l) \
276 _ATTR_EXPAND11(a, b, c, d, e, f, g, h, i, j, k) \
277 GPU_VERTEX_FORMAT_ADD_ATTR(l)
278#define _ATTR_EXPAND13(a, b, c, d, e, f, g, h, i, j, k, l, m) \
279 _ATTR_EXPAND12(a, b, c, d, e, f, g, h, i, j, k, l) \
280 GPU_VERTEX_FORMAT_ADD_ATTR(m)
281#define _ATTR_EXPAND14(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
282 _ATTR_EXPAND13(a, b, c, d, e, f, g, h, i, j, k, l, m) \
283 GPU_VERTEX_FORMAT_ADD_ATTR(n)
284#define _ATTR_EXPAND15(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) \
285 _ATTR_EXPAND14(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
286 GPU_VERTEX_FORMAT_ADD_ATTR(o)
287#define _ATTR_EXPAND16(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \
288 _ATTR_EXPAND15(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) \
289 GPU_VERTEX_FORMAT_ADD_ATTR(p)
292#define GPU_VERTEX_FORMAT_ADD_ATTR_EXPAND(...) VA_NARGS_CALL_OVERLOAD(_ATTR_EXPAND, __VA_ARGS__)
294#define GPU_VERTEX_FORMAT_FUNC(_VertT, ...) \
295 static GPUVertFormat &format() \
297 using VertT = _VertT; \
298 static GPUVertFormat format = {}; \
299 if (format.attr_len == 0) { \
300 GPU_VERTEX_FORMAT_ADD_ATTR_EXPAND(__VA_ARGS__) \
301 format.stride = sizeof(VertT); \
302 BLI_STATIC_ASSERT(sizeof(VertT) < 1024, "Vertex format is too big") \
303 format.packed = true; \
304 BLI_STATIC_ASSERT_ALIGN(VertT, 4) \
#define BLI_STATIC_ASSERT(a, msg)
constexpr DataFormat to_data_format(TextureFormat format)
blender::gpu::VertAttrType format
GPUVertFetchMode fetch_mode() const
GPUVertCompType comp_type() const
struct GPUVertAttr::Type type
uchar names[GPU_VERT_ATTR_MAX_NAMES]