summaryrefslogtreecommitdiff
path: root/contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h')
-rw-r--r--contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h998
1 files changed, 998 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h b/contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h
new file mode 100644
index 0000000..6de1765
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/gpu/SDL_sysgpu.h
@@ -0,0 +1,998 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../video/SDL_sysvideo.h"
22#include "SDL_internal.h"
23
24#ifndef SDL_GPU_DRIVER_H
25#define SDL_GPU_DRIVER_H
26
27// Common Structs
28
29typedef struct Pass
30{
31 SDL_GPUCommandBuffer *command_buffer;
32 bool in_progress;
33} Pass;
34
35typedef struct CommandBufferCommonHeader
36{
37 SDL_GPUDevice *device;
38 Pass render_pass;
39 bool graphics_pipeline_bound;
40 Pass compute_pass;
41 bool compute_pipeline_bound;
42 Pass copy_pass;
43 bool swapchain_texture_acquired;
44 bool submitted;
45} CommandBufferCommonHeader;
46
47typedef struct TextureCommonHeader
48{
49 SDL_GPUTextureCreateInfo info;
50} TextureCommonHeader;
51
52typedef struct BlitFragmentUniforms
53{
54 // texcoord space
55 float left;
56 float top;
57 float width;
58 float height;
59
60 Uint32 mip_level;
61 float layer_or_depth;
62} BlitFragmentUniforms;
63
64typedef struct BlitPipelineCacheEntry
65{
66 SDL_GPUTextureType type;
67 SDL_GPUTextureFormat format;
68 SDL_GPUGraphicsPipeline *pipeline;
69} BlitPipelineCacheEntry;
70
71// Internal Helper Utilities
72
73#define SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE (SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT + 1)
74#define SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE (SDL_GPU_VERTEXELEMENTFORMAT_HALF4 + 1)
75#define SDL_GPU_COMPAREOP_MAX_ENUM_VALUE (SDL_GPU_COMPAREOP_ALWAYS + 1)
76#define SDL_GPU_STENCILOP_MAX_ENUM_VALUE (SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + 1)
77#define SDL_GPU_BLENDOP_MAX_ENUM_VALUE (SDL_GPU_BLENDOP_MAX + 1)
78#define SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE (SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + 1)
79#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 + 1)
80#define SDL_GPU_PRESENTMODE_MAX_ENUM_VALUE (SDL_GPU_PRESENTMODE_MAILBOX + 1)
81
82static inline Sint32 Texture_GetBlockWidth(
83 SDL_GPUTextureFormat format)
84{
85 switch (format) {
86 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
87 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
88 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
89 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
90 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
91 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
92 return 12;
93 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM:
94 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM:
95 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM:
96 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM:
97 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB:
98 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB:
99 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB:
100 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB:
101 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT:
102 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT:
103 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT:
104 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT:
105 return 10;
106 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM:
107 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
108 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
109 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB:
110 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB:
111 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB:
112 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT:
113 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
114 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
115 return 8;
116 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
117 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
118 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
119 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
120 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
121 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
122 return 6;
123 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
124 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
125 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
126 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
127 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
128 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
129 return 5;
130 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
131 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
132 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
133 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM:
134 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM:
135 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
136 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT:
137 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT:
138 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
139 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
140 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
141 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
142 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
143 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
144 return 4;
145 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
146 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
147 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
148 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
149 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
150 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
151 case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM:
152 case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM:
153 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
154 case SDL_GPU_TEXTUREFORMAT_R8_UNORM:
155 case SDL_GPU_TEXTUREFORMAT_R16_UNORM:
156 case SDL_GPU_TEXTUREFORMAT_A8_UNORM:
157 case SDL_GPU_TEXTUREFORMAT_R8_SNORM:
158 case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM:
159 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
160 case SDL_GPU_TEXTUREFORMAT_R16_SNORM:
161 case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM:
162 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM:
163 case SDL_GPU_TEXTUREFORMAT_R16_FLOAT:
164 case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT:
165 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
166 case SDL_GPU_TEXTUREFORMAT_R32_FLOAT:
167 case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT:
168 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
169 case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT:
170 case SDL_GPU_TEXTUREFORMAT_R8_UINT:
171 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT:
172 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
173 case SDL_GPU_TEXTUREFORMAT_R16_UINT:
174 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT:
175 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
176 case SDL_GPU_TEXTUREFORMAT_R32_UINT:
177 case SDL_GPU_TEXTUREFORMAT_R32G32_UINT:
178 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT:
179 case SDL_GPU_TEXTUREFORMAT_R8_INT:
180 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
181 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
182 case SDL_GPU_TEXTUREFORMAT_R16_INT:
183 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
184 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
185 case SDL_GPU_TEXTUREFORMAT_R32_INT:
186 case SDL_GPU_TEXTUREFORMAT_R32G32_INT:
187 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT:
188 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
189 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
190 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
191 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
192 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
193 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
194 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
195 return 1;
196 default:
197 SDL_assert_release(!"Unrecognized TextureFormat!");
198 return 0;
199 }
200}
201
202static inline Sint32 Texture_GetBlockHeight(
203 SDL_GPUTextureFormat format)
204{
205 switch (format) {
206 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
207 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
208 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
209 return 12;
210 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
211 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
212 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
213 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM:
214 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB:
215 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT:
216 return 10;
217 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM:
218 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB:
219 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT:
220 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
221 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB:
222 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
223 return 8;
224 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM:
225 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB:
226 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT:
227 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
228 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB:
229 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
230 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
231 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
232 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
233 return 6;
234 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM:
235 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB:
236 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT:
237 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM:
238 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB:
239 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT:
240 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
241 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
242 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
243 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
244 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
245 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
246 return 5;
247 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
248 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
249 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
250 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM:
251 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM:
252 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
253 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT:
254 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT:
255 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
256 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
257 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
258 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
259 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
260 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
261 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
262 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
263 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
264 return 4;
265 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
266 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
267 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
268 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
269 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
270 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
271 case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM:
272 case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM:
273 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
274 case SDL_GPU_TEXTUREFORMAT_R8_UNORM:
275 case SDL_GPU_TEXTUREFORMAT_R16_UNORM:
276 case SDL_GPU_TEXTUREFORMAT_A8_UNORM:
277 case SDL_GPU_TEXTUREFORMAT_R8_SNORM:
278 case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM:
279 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
280 case SDL_GPU_TEXTUREFORMAT_R16_SNORM:
281 case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM:
282 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM:
283 case SDL_GPU_TEXTUREFORMAT_R16_FLOAT:
284 case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT:
285 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
286 case SDL_GPU_TEXTUREFORMAT_R32_FLOAT:
287 case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT:
288 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
289 case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT:
290 case SDL_GPU_TEXTUREFORMAT_R8_UINT:
291 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT:
292 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
293 case SDL_GPU_TEXTUREFORMAT_R16_UINT:
294 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT:
295 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
296 case SDL_GPU_TEXTUREFORMAT_R32_UINT:
297 case SDL_GPU_TEXTUREFORMAT_R32G32_UINT:
298 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT:
299 case SDL_GPU_TEXTUREFORMAT_R8_INT:
300 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
301 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
302 case SDL_GPU_TEXTUREFORMAT_R16_INT:
303 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
304 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
305 case SDL_GPU_TEXTUREFORMAT_R32_INT:
306 case SDL_GPU_TEXTUREFORMAT_R32G32_INT:
307 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT:
308 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
309 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
310 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
311 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
312 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
313 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
314 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
315 return 1;
316 default:
317 SDL_assert_release(!"Unrecognized TextureFormat!");
318 return 0;
319 }
320}
321
322static inline bool IsDepthFormat(
323 SDL_GPUTextureFormat format)
324{
325 switch (format) {
326 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
327 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
328 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
329 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
330 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
331 return true;
332
333 default:
334 return false;
335 }
336}
337
338static inline bool IsStencilFormat(
339 SDL_GPUTextureFormat format)
340{
341 switch (format) {
342 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
343 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
344 return true;
345
346 default:
347 return false;
348 }
349}
350
351static inline bool IsIntegerFormat(
352 SDL_GPUTextureFormat format)
353{
354 switch (format) {
355 case SDL_GPU_TEXTUREFORMAT_R8_UINT:
356 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT:
357 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
358 case SDL_GPU_TEXTUREFORMAT_R16_UINT:
359 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT:
360 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
361 case SDL_GPU_TEXTUREFORMAT_R8_INT:
362 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
363 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
364 case SDL_GPU_TEXTUREFORMAT_R16_INT:
365 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
366 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
367 return true;
368
369 default:
370 return false;
371 }
372}
373
374static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
375{
376 return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;
377}
378
379static inline Uint32 BytesPerRow(
380 Sint32 width,
381 SDL_GPUTextureFormat format)
382{
383 Uint32 blockWidth = Texture_GetBlockWidth(format);
384 Uint32 blocksPerRow = (width + blockWidth - 1) / blockWidth;
385 return blocksPerRow * SDL_GPUTextureFormatTexelBlockSize(format);
386}
387
388// GraphicsDevice Limits
389
390#define MAX_TEXTURE_SAMPLERS_PER_STAGE 16
391#define MAX_STORAGE_TEXTURES_PER_STAGE 8
392#define MAX_STORAGE_BUFFERS_PER_STAGE 8
393#define MAX_UNIFORM_BUFFERS_PER_STAGE 4
394#define MAX_COMPUTE_WRITE_TEXTURES 8
395#define MAX_COMPUTE_WRITE_BUFFERS 8
396#define UNIFORM_BUFFER_SIZE 32768
397#define MAX_VERTEX_BUFFERS 16
398#define MAX_VERTEX_ATTRIBUTES 16
399#define MAX_COLOR_TARGET_BINDINGS 4
400#define MAX_PRESENT_COUNT 16
401#define MAX_FRAMES_IN_FLIGHT 3
402
403// Internal Macros
404
405#define EXPAND_ARRAY_IF_NEEDED(arr, elementType, newCount, capacity, newCapacity) \
406 do { \
407 if ((newCount) >= (capacity)) { \
408 (capacity) = (newCapacity); \
409 (arr) = (elementType *)SDL_realloc( \
410 (arr), \
411 sizeof(elementType) * (capacity)); \
412 } \
413 } while (0)
414
415// Internal Declarations
416
417#ifdef __cplusplus
418extern "C" {
419#endif // __cplusplus
420
421SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
422 SDL_GPUDevice *device,
423 SDL_GPUTextureType sourceTextureType,
424 SDL_GPUTextureFormat destinationFormat,
425 SDL_GPUShader *blitVertexShader,
426 SDL_GPUShader *blitFrom2DShader,
427 SDL_GPUShader *blitFrom2DArrayShader,
428 SDL_GPUShader *blitFrom3DShader,
429 SDL_GPUShader *blitFromCubeShader,
430 SDL_GPUShader *blitFromCubeArrayShader,
431 BlitPipelineCacheEntry **blitPipelines,
432 Uint32 *blitPipelineCount,
433 Uint32 *blitPipelineCapacity);
434
435void SDL_GPU_BlitCommon(
436 SDL_GPUCommandBuffer *commandBuffer,
437 const SDL_GPUBlitInfo *info,
438 SDL_GPUSampler *blitLinearSampler,
439 SDL_GPUSampler *blitNearestSampler,
440 SDL_GPUShader *blitVertexShader,
441 SDL_GPUShader *blitFrom2DShader,
442 SDL_GPUShader *blitFrom2DArrayShader,
443 SDL_GPUShader *blitFrom3DShader,
444 SDL_GPUShader *blitFromCubeShader,
445 SDL_GPUShader *blitFromCubeArrayShader,
446 BlitPipelineCacheEntry **blitPipelines,
447 Uint32 *blitPipelineCount,
448 Uint32 *blitPipelineCapacity);
449
450#ifdef __cplusplus
451}
452#endif // __cplusplus
453
454// SDL_GPUDevice Definition
455
456typedef struct SDL_GPURenderer SDL_GPURenderer;
457
458struct SDL_GPUDevice
459{
460 // Quit
461
462 void (*DestroyDevice)(SDL_GPUDevice *device);
463
464 // State Creation
465
466 SDL_GPUComputePipeline *(*CreateComputePipeline)(
467 SDL_GPURenderer *driverData,
468 const SDL_GPUComputePipelineCreateInfo *createinfo);
469
470 SDL_GPUGraphicsPipeline *(*CreateGraphicsPipeline)(
471 SDL_GPURenderer *driverData,
472 const SDL_GPUGraphicsPipelineCreateInfo *createinfo);
473
474 SDL_GPUSampler *(*CreateSampler)(
475 SDL_GPURenderer *driverData,
476 const SDL_GPUSamplerCreateInfo *createinfo);
477
478 SDL_GPUShader *(*CreateShader)(
479 SDL_GPURenderer *driverData,
480 const SDL_GPUShaderCreateInfo *createinfo);
481
482 SDL_GPUTexture *(*CreateTexture)(
483 SDL_GPURenderer *driverData,
484 const SDL_GPUTextureCreateInfo *createinfo);
485
486 SDL_GPUBuffer *(*CreateBuffer)(
487 SDL_GPURenderer *driverData,
488 SDL_GPUBufferUsageFlags usageFlags,
489 Uint32 size,
490 const char *debugName);
491
492 SDL_GPUTransferBuffer *(*CreateTransferBuffer)(
493 SDL_GPURenderer *driverData,
494 SDL_GPUTransferBufferUsage usage,
495 Uint32 size,
496 const char *debugName);
497
498 // Debug Naming
499
500 void (*SetBufferName)(
501 SDL_GPURenderer *driverData,
502 SDL_GPUBuffer *buffer,
503 const char *text);
504
505 void (*SetTextureName)(
506 SDL_GPURenderer *driverData,
507 SDL_GPUTexture *texture,
508 const char *text);
509
510 void (*InsertDebugLabel)(
511 SDL_GPUCommandBuffer *commandBuffer,
512 const char *text);
513
514 void (*PushDebugGroup)(
515 SDL_GPUCommandBuffer *commandBuffer,
516 const char *name);
517
518 void (*PopDebugGroup)(
519 SDL_GPUCommandBuffer *commandBuffer);
520
521 // Disposal
522
523 void (*ReleaseTexture)(
524 SDL_GPURenderer *driverData,
525 SDL_GPUTexture *texture);
526
527 void (*ReleaseSampler)(
528 SDL_GPURenderer *driverData,
529 SDL_GPUSampler *sampler);
530
531 void (*ReleaseBuffer)(
532 SDL_GPURenderer *driverData,
533 SDL_GPUBuffer *buffer);
534
535 void (*ReleaseTransferBuffer)(
536 SDL_GPURenderer *driverData,
537 SDL_GPUTransferBuffer *transferBuffer);
538
539 void (*ReleaseShader)(
540 SDL_GPURenderer *driverData,
541 SDL_GPUShader *shader);
542
543 void (*ReleaseComputePipeline)(
544 SDL_GPURenderer *driverData,
545 SDL_GPUComputePipeline *computePipeline);
546
547 void (*ReleaseGraphicsPipeline)(
548 SDL_GPURenderer *driverData,
549 SDL_GPUGraphicsPipeline *graphicsPipeline);
550
551 // Render Pass
552
553 void (*BeginRenderPass)(
554 SDL_GPUCommandBuffer *commandBuffer,
555 const SDL_GPUColorTargetInfo *colorTargetInfos,
556 Uint32 numColorTargets,
557 const SDL_GPUDepthStencilTargetInfo *depthStencilTargetInfo);
558
559 void (*BindGraphicsPipeline)(
560 SDL_GPUCommandBuffer *commandBuffer,
561 SDL_GPUGraphicsPipeline *graphicsPipeline);
562
563 void (*SetViewport)(
564 SDL_GPUCommandBuffer *commandBuffer,
565 const SDL_GPUViewport *viewport);
566
567 void (*SetScissor)(
568 SDL_GPUCommandBuffer *commandBuffer,
569 const SDL_Rect *scissor);
570
571 void (*SetBlendConstants)(
572 SDL_GPUCommandBuffer *commandBuffer,
573 SDL_FColor blendConstants);
574
575 void (*SetStencilReference)(
576 SDL_GPUCommandBuffer *commandBuffer,
577 Uint8 reference);
578
579 void (*BindVertexBuffers)(
580 SDL_GPUCommandBuffer *commandBuffer,
581 Uint32 firstSlot,
582 const SDL_GPUBufferBinding *bindings,
583 Uint32 numBindings);
584
585 void (*BindIndexBuffer)(
586 SDL_GPUCommandBuffer *commandBuffer,
587 const SDL_GPUBufferBinding *binding,
588 SDL_GPUIndexElementSize indexElementSize);
589
590 void (*BindVertexSamplers)(
591 SDL_GPUCommandBuffer *commandBuffer,
592 Uint32 firstSlot,
593 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
594 Uint32 numBindings);
595
596 void (*BindVertexStorageTextures)(
597 SDL_GPUCommandBuffer *commandBuffer,
598 Uint32 firstSlot,
599 SDL_GPUTexture *const *storageTextures,
600 Uint32 numBindings);
601
602 void (*BindVertexStorageBuffers)(
603 SDL_GPUCommandBuffer *commandBuffer,
604 Uint32 firstSlot,
605 SDL_GPUBuffer *const *storageBuffers,
606 Uint32 numBindings);
607
608 void (*BindFragmentSamplers)(
609 SDL_GPUCommandBuffer *commandBuffer,
610 Uint32 firstSlot,
611 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
612 Uint32 numBindings);
613
614 void (*BindFragmentStorageTextures)(
615 SDL_GPUCommandBuffer *commandBuffer,
616 Uint32 firstSlot,
617 SDL_GPUTexture *const *storageTextures,
618 Uint32 numBindings);
619
620 void (*BindFragmentStorageBuffers)(
621 SDL_GPUCommandBuffer *commandBuffer,
622 Uint32 firstSlot,
623 SDL_GPUBuffer *const *storageBuffers,
624 Uint32 numBindings);
625
626 void (*PushVertexUniformData)(
627 SDL_GPUCommandBuffer *commandBuffer,
628 Uint32 slotIndex,
629 const void *data,
630 Uint32 length);
631
632 void (*PushFragmentUniformData)(
633 SDL_GPUCommandBuffer *commandBuffer,
634 Uint32 slotIndex,
635 const void *data,
636 Uint32 length);
637
638 void (*DrawIndexedPrimitives)(
639 SDL_GPUCommandBuffer *commandBuffer,
640 Uint32 numIndices,
641 Uint32 numInstances,
642 Uint32 firstIndex,
643 Sint32 vertexOffset,
644 Uint32 firstInstance);
645
646 void (*DrawPrimitives)(
647 SDL_GPUCommandBuffer *commandBuffer,
648 Uint32 numVertices,
649 Uint32 numInstances,
650 Uint32 firstVertex,
651 Uint32 firstInstance);
652
653 void (*DrawPrimitivesIndirect)(
654 SDL_GPUCommandBuffer *commandBuffer,
655 SDL_GPUBuffer *buffer,
656 Uint32 offset,
657 Uint32 drawCount);
658
659 void (*DrawIndexedPrimitivesIndirect)(
660 SDL_GPUCommandBuffer *commandBuffer,
661 SDL_GPUBuffer *buffer,
662 Uint32 offset,
663 Uint32 drawCount);
664
665 void (*EndRenderPass)(
666 SDL_GPUCommandBuffer *commandBuffer);
667
668 // Compute Pass
669
670 void (*BeginComputePass)(
671 SDL_GPUCommandBuffer *commandBuffer,
672 const SDL_GPUStorageTextureReadWriteBinding *storageTextureBindings,
673 Uint32 numStorageTextureBindings,
674 const SDL_GPUStorageBufferReadWriteBinding *storageBufferBindings,
675 Uint32 numStorageBufferBindings);
676
677 void (*BindComputePipeline)(
678 SDL_GPUCommandBuffer *commandBuffer,
679 SDL_GPUComputePipeline *computePipeline);
680
681 void (*BindComputeSamplers)(
682 SDL_GPUCommandBuffer *commandBuffer,
683 Uint32 firstSlot,
684 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
685 Uint32 numBindings);
686
687 void (*BindComputeStorageTextures)(
688 SDL_GPUCommandBuffer *commandBuffer,
689 Uint32 firstSlot,
690 SDL_GPUTexture *const *storageTextures,
691 Uint32 numBindings);
692
693 void (*BindComputeStorageBuffers)(
694 SDL_GPUCommandBuffer *commandBuffer,
695 Uint32 firstSlot,
696 SDL_GPUBuffer *const *storageBuffers,
697 Uint32 numBindings);
698
699 void (*PushComputeUniformData)(
700 SDL_GPUCommandBuffer *commandBuffer,
701 Uint32 slotIndex,
702 const void *data,
703 Uint32 length);
704
705 void (*DispatchCompute)(
706 SDL_GPUCommandBuffer *commandBuffer,
707 Uint32 groupcountX,
708 Uint32 groupcountY,
709 Uint32 groupcountZ);
710
711 void (*DispatchComputeIndirect)(
712 SDL_GPUCommandBuffer *commandBuffer,
713 SDL_GPUBuffer *buffer,
714 Uint32 offset);
715
716 void (*EndComputePass)(
717 SDL_GPUCommandBuffer *commandBuffer);
718
719 // TransferBuffer Data
720
721 void *(*MapTransferBuffer)(
722 SDL_GPURenderer *device,
723 SDL_GPUTransferBuffer *transferBuffer,
724 bool cycle);
725
726 void (*UnmapTransferBuffer)(
727 SDL_GPURenderer *device,
728 SDL_GPUTransferBuffer *transferBuffer);
729
730 // Copy Pass
731
732 void (*BeginCopyPass)(
733 SDL_GPUCommandBuffer *commandBuffer);
734
735 void (*UploadToTexture)(
736 SDL_GPUCommandBuffer *commandBuffer,
737 const SDL_GPUTextureTransferInfo *source,
738 const SDL_GPUTextureRegion *destination,
739 bool cycle);
740
741 void (*UploadToBuffer)(
742 SDL_GPUCommandBuffer *commandBuffer,
743 const SDL_GPUTransferBufferLocation *source,
744 const SDL_GPUBufferRegion *destination,
745 bool cycle);
746
747 void (*CopyTextureToTexture)(
748 SDL_GPUCommandBuffer *commandBuffer,
749 const SDL_GPUTextureLocation *source,
750 const SDL_GPUTextureLocation *destination,
751 Uint32 w,
752 Uint32 h,
753 Uint32 d,
754 bool cycle);
755
756 void (*CopyBufferToBuffer)(
757 SDL_GPUCommandBuffer *commandBuffer,
758 const SDL_GPUBufferLocation *source,
759 const SDL_GPUBufferLocation *destination,
760 Uint32 size,
761 bool cycle);
762
763 void (*GenerateMipmaps)(
764 SDL_GPUCommandBuffer *commandBuffer,
765 SDL_GPUTexture *texture);
766
767 void (*DownloadFromTexture)(
768 SDL_GPUCommandBuffer *commandBuffer,
769 const SDL_GPUTextureRegion *source,
770 const SDL_GPUTextureTransferInfo *destination);
771
772 void (*DownloadFromBuffer)(
773 SDL_GPUCommandBuffer *commandBuffer,
774 const SDL_GPUBufferRegion *source,
775 const SDL_GPUTransferBufferLocation *destination);
776
777 void (*EndCopyPass)(
778 SDL_GPUCommandBuffer *commandBuffer);
779
780 void (*Blit)(
781 SDL_GPUCommandBuffer *commandBuffer,
782 const SDL_GPUBlitInfo *info);
783
784 // Submission/Presentation
785
786 bool (*SupportsSwapchainComposition)(
787 SDL_GPURenderer *driverData,
788 SDL_Window *window,
789 SDL_GPUSwapchainComposition swapchainComposition);
790
791 bool (*SupportsPresentMode)(
792 SDL_GPURenderer *driverData,
793 SDL_Window *window,
794 SDL_GPUPresentMode presentMode);
795
796 bool (*ClaimWindow)(
797 SDL_GPURenderer *driverData,
798 SDL_Window *window);
799
800 void (*ReleaseWindow)(
801 SDL_GPURenderer *driverData,
802 SDL_Window *window);
803
804 bool (*SetSwapchainParameters)(
805 SDL_GPURenderer *driverData,
806 SDL_Window *window,
807 SDL_GPUSwapchainComposition swapchainComposition,
808 SDL_GPUPresentMode presentMode);
809
810 bool (*SetAllowedFramesInFlight)(
811 SDL_GPURenderer *driverData,
812 Uint32 allowedFramesInFlight);
813
814 SDL_GPUTextureFormat (*GetSwapchainTextureFormat)(
815 SDL_GPURenderer *driverData,
816 SDL_Window *window);
817
818 SDL_GPUCommandBuffer *(*AcquireCommandBuffer)(
819 SDL_GPURenderer *driverData);
820
821 bool (*AcquireSwapchainTexture)(
822 SDL_GPUCommandBuffer *commandBuffer,
823 SDL_Window *window,
824 SDL_GPUTexture **swapchainTexture,
825 Uint32 *swapchainTextureWidth,
826 Uint32 *swapchainTextureHeight);
827
828 bool (*WaitForSwapchain)(
829 SDL_GPURenderer *driverData,
830 SDL_Window *window);
831
832 bool (*WaitAndAcquireSwapchainTexture)(
833 SDL_GPUCommandBuffer *commandBuffer,
834 SDL_Window *window,
835 SDL_GPUTexture **swapchainTexture,
836 Uint32 *swapchainTextureWidth,
837 Uint32 *swapchainTextureHeight);
838
839 bool (*Submit)(
840 SDL_GPUCommandBuffer *commandBuffer);
841
842 SDL_GPUFence *(*SubmitAndAcquireFence)(
843 SDL_GPUCommandBuffer *commandBuffer);
844
845 bool (*Cancel)(
846 SDL_GPUCommandBuffer *commandBuffer);
847
848 bool (*Wait)(
849 SDL_GPURenderer *driverData);
850
851 bool (*WaitForFences)(
852 SDL_GPURenderer *driverData,
853 bool waitAll,
854 SDL_GPUFence *const *fences,
855 Uint32 numFences);
856
857 bool (*QueryFence)(
858 SDL_GPURenderer *driverData,
859 SDL_GPUFence *fence);
860
861 void (*ReleaseFence)(
862 SDL_GPURenderer *driverData,
863 SDL_GPUFence *fence);
864
865 // Feature Queries
866
867 bool (*SupportsTextureFormat)(
868 SDL_GPURenderer *driverData,
869 SDL_GPUTextureFormat format,
870 SDL_GPUTextureType type,
871 SDL_GPUTextureUsageFlags usage);
872
873 bool (*SupportsSampleCount)(
874 SDL_GPURenderer *driverData,
875 SDL_GPUTextureFormat format,
876 SDL_GPUSampleCount desiredSampleCount);
877
878 // Opaque pointer for the Driver
879 SDL_GPURenderer *driverData;
880
881 // Store this for SDL_GetGPUDeviceDriver()
882 const char *backend;
883
884 // Store this for SDL_GetGPUShaderFormats()
885 SDL_GPUShaderFormat shader_formats;
886
887 // Store this for SDL_gpu.c's debug layer
888 bool debug_mode;
889};
890
891#define ASSIGN_DRIVER_FUNC(func, name) \
892 result->func = name##_##func;
893#define ASSIGN_DRIVER(name) \
894 ASSIGN_DRIVER_FUNC(DestroyDevice, name) \
895 ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \
896 ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \
897 ASSIGN_DRIVER_FUNC(CreateSampler, name) \
898 ASSIGN_DRIVER_FUNC(CreateShader, name) \
899 ASSIGN_DRIVER_FUNC(CreateTexture, name) \
900 ASSIGN_DRIVER_FUNC(CreateBuffer, name) \
901 ASSIGN_DRIVER_FUNC(CreateTransferBuffer, name) \
902 ASSIGN_DRIVER_FUNC(SetBufferName, name) \
903 ASSIGN_DRIVER_FUNC(SetTextureName, name) \
904 ASSIGN_DRIVER_FUNC(InsertDebugLabel, name) \
905 ASSIGN_DRIVER_FUNC(PushDebugGroup, name) \
906 ASSIGN_DRIVER_FUNC(PopDebugGroup, name) \
907 ASSIGN_DRIVER_FUNC(ReleaseTexture, name) \
908 ASSIGN_DRIVER_FUNC(ReleaseSampler, name) \
909 ASSIGN_DRIVER_FUNC(ReleaseBuffer, name) \
910 ASSIGN_DRIVER_FUNC(ReleaseTransferBuffer, name) \
911 ASSIGN_DRIVER_FUNC(ReleaseShader, name) \
912 ASSIGN_DRIVER_FUNC(ReleaseComputePipeline, name) \
913 ASSIGN_DRIVER_FUNC(ReleaseGraphicsPipeline, name) \
914 ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \
915 ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \
916 ASSIGN_DRIVER_FUNC(SetViewport, name) \
917 ASSIGN_DRIVER_FUNC(SetScissor, name) \
918 ASSIGN_DRIVER_FUNC(SetBlendConstants, name) \
919 ASSIGN_DRIVER_FUNC(SetStencilReference, name) \
920 ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \
921 ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \
922 ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \
923 ASSIGN_DRIVER_FUNC(BindVertexStorageTextures, name) \
924 ASSIGN_DRIVER_FUNC(BindVertexStorageBuffers, name) \
925 ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \
926 ASSIGN_DRIVER_FUNC(BindFragmentStorageTextures, name) \
927 ASSIGN_DRIVER_FUNC(BindFragmentStorageBuffers, name) \
928 ASSIGN_DRIVER_FUNC(PushVertexUniformData, name) \
929 ASSIGN_DRIVER_FUNC(PushFragmentUniformData, name) \
930 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \
931 ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \
932 ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \
933 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitivesIndirect, name) \
934 ASSIGN_DRIVER_FUNC(EndRenderPass, name) \
935 ASSIGN_DRIVER_FUNC(BeginComputePass, name) \
936 ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \
937 ASSIGN_DRIVER_FUNC(BindComputeSamplers, name) \
938 ASSIGN_DRIVER_FUNC(BindComputeStorageTextures, name) \
939 ASSIGN_DRIVER_FUNC(BindComputeStorageBuffers, name) \
940 ASSIGN_DRIVER_FUNC(PushComputeUniformData, name) \
941 ASSIGN_DRIVER_FUNC(DispatchCompute, name) \
942 ASSIGN_DRIVER_FUNC(DispatchComputeIndirect, name) \
943 ASSIGN_DRIVER_FUNC(EndComputePass, name) \
944 ASSIGN_DRIVER_FUNC(MapTransferBuffer, name) \
945 ASSIGN_DRIVER_FUNC(UnmapTransferBuffer, name) \
946 ASSIGN_DRIVER_FUNC(BeginCopyPass, name) \
947 ASSIGN_DRIVER_FUNC(UploadToTexture, name) \
948 ASSIGN_DRIVER_FUNC(UploadToBuffer, name) \
949 ASSIGN_DRIVER_FUNC(DownloadFromTexture, name) \
950 ASSIGN_DRIVER_FUNC(DownloadFromBuffer, name) \
951 ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \
952 ASSIGN_DRIVER_FUNC(CopyBufferToBuffer, name) \
953 ASSIGN_DRIVER_FUNC(GenerateMipmaps, name) \
954 ASSIGN_DRIVER_FUNC(EndCopyPass, name) \
955 ASSIGN_DRIVER_FUNC(Blit, name) \
956 ASSIGN_DRIVER_FUNC(SupportsSwapchainComposition, name) \
957 ASSIGN_DRIVER_FUNC(SupportsPresentMode, name) \
958 ASSIGN_DRIVER_FUNC(ClaimWindow, name) \
959 ASSIGN_DRIVER_FUNC(ReleaseWindow, name) \
960 ASSIGN_DRIVER_FUNC(SetSwapchainParameters, name) \
961 ASSIGN_DRIVER_FUNC(SetAllowedFramesInFlight, name) \
962 ASSIGN_DRIVER_FUNC(GetSwapchainTextureFormat, name) \
963 ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \
964 ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \
965 ASSIGN_DRIVER_FUNC(WaitForSwapchain, name) \
966 ASSIGN_DRIVER_FUNC(WaitAndAcquireSwapchainTexture, name)\
967 ASSIGN_DRIVER_FUNC(Submit, name) \
968 ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \
969 ASSIGN_DRIVER_FUNC(Cancel, name) \
970 ASSIGN_DRIVER_FUNC(Wait, name) \
971 ASSIGN_DRIVER_FUNC(WaitForFences, name) \
972 ASSIGN_DRIVER_FUNC(QueryFence, name) \
973 ASSIGN_DRIVER_FUNC(ReleaseFence, name) \
974 ASSIGN_DRIVER_FUNC(SupportsTextureFormat, name) \
975 ASSIGN_DRIVER_FUNC(SupportsSampleCount, name)
976
977typedef struct SDL_GPUBootstrap
978{
979 const char *name;
980 const SDL_GPUShaderFormat shader_formats;
981 bool (*PrepareDriver)(SDL_VideoDevice *_this);
982 SDL_GPUDevice *(*CreateDevice)(bool debug_mode, bool prefer_low_power, SDL_PropertiesID props);
983} SDL_GPUBootstrap;
984
985#ifdef __cplusplus
986extern "C" {
987#endif
988
989extern SDL_GPUBootstrap VulkanDriver;
990extern SDL_GPUBootstrap D3D12Driver;
991extern SDL_GPUBootstrap MetalDriver;
992extern SDL_GPUBootstrap PrivateGPUDriver;
993
994#ifdef __cplusplus
995}
996#endif
997
998#endif // SDL_GPU_DRIVER_H