1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2024 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_R8_INT:
177 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
178 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
179 case SDL_GPU_TEXTUREFORMAT_R16_INT:
180 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
181 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
182 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
183 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
184 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
185 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
186 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
187 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
188 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
189 return 1;
190 default:
191 SDL_assert_release(!"Unrecognized TextureFormat!");
192 return 0;
193 }
194}
195
196static inline Sint32 Texture_GetBlockHeight(
197 SDL_GPUTextureFormat format)
198{
199 switch (format) {
200 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
201 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
202 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
203 return 12;
204 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
205 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
206 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
207 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM:
208 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB:
209 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT:
210 return 10;
211 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM:
212 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB:
213 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT:
214 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
215 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB:
216 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
217 return 8;
218 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM:
219 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB:
220 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT:
221 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
222 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB:
223 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
224 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
225 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
226 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
227 return 6;
228 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM:
229 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB:
230 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT:
231 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM:
232 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB:
233 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT:
234 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
235 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
236 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
237 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
238 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
239 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
240 return 5;
241 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
242 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
243 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
244 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM:
245 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM:
246 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
247 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT:
248 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT:
249 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
250 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
251 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
252 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
253 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
254 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
255 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
256 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
257 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
258 return 4;
259 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
260 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
261 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
262 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
263 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
264 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
265 case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM:
266 case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM:
267 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
268 case SDL_GPU_TEXTUREFORMAT_R8_UNORM:
269 case SDL_GPU_TEXTUREFORMAT_R16_UNORM:
270 case SDL_GPU_TEXTUREFORMAT_A8_UNORM:
271 case SDL_GPU_TEXTUREFORMAT_R8_SNORM:
272 case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM:
273 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
274 case SDL_GPU_TEXTUREFORMAT_R16_SNORM:
275 case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM:
276 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM:
277 case SDL_GPU_TEXTUREFORMAT_R16_FLOAT:
278 case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT:
279 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
280 case SDL_GPU_TEXTUREFORMAT_R32_FLOAT:
281 case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT:
282 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
283 case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT:
284 case SDL_GPU_TEXTUREFORMAT_R8_UINT:
285 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT:
286 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
287 case SDL_GPU_TEXTUREFORMAT_R16_UINT:
288 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT:
289 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
290 case SDL_GPU_TEXTUREFORMAT_R8_INT:
291 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
292 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
293 case SDL_GPU_TEXTUREFORMAT_R16_INT:
294 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
295 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
296 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
297 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
298 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
299 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
300 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
301 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
302 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
303 return 1;
304 default:
305 SDL_assert_release(!"Unrecognized TextureFormat!");
306 return 0;
307 }
308}
309
310static inline bool IsDepthFormat(
311 SDL_GPUTextureFormat format)
312{
313 switch (format) {
314 case SDL_GPU_TEXTUREFORMAT_D16_UNORM:
315 case SDL_GPU_TEXTUREFORMAT_D24_UNORM:
316 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT:
317 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
318 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
319 return true;
320
321 default:
322 return false;
323 }
324}
325
326static inline bool IsStencilFormat(
327 SDL_GPUTextureFormat format)
328{
329 switch (format) {
330 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT:
331 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT:
332 return true;
333
334 default:
335 return false;
336 }
337}
338
339static inline bool IsIntegerFormat(
340 SDL_GPUTextureFormat format)
341{
342 switch (format) {
343 case SDL_GPU_TEXTUREFORMAT_R8_UINT:
344 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT:
345 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
346 case SDL_GPU_TEXTUREFORMAT_R16_UINT:
347 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT:
348 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
349 case SDL_GPU_TEXTUREFORMAT_R8_INT:
350 case SDL_GPU_TEXTUREFORMAT_R8G8_INT:
351 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
352 case SDL_GPU_TEXTUREFORMAT_R16_INT:
353 case SDL_GPU_TEXTUREFORMAT_R16G16_INT:
354 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
355 return true;
356
357 default:
358 return false;
359 }
360}
361
362static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
363{
364 return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;
365}
366
367static inline Uint32 BytesPerRow(
368 Sint32 width,
369 SDL_GPUTextureFormat format)
370{
371 Uint32 blockWidth = Texture_GetBlockWidth(format);
372 Uint32 blocksPerRow = (width + blockWidth - 1) / blockWidth;
373 return blocksPerRow * SDL_GPUTextureFormatTexelBlockSize(format);
374}
375
376// GraphicsDevice Limits
377
378#define MAX_TEXTURE_SAMPLERS_PER_STAGE 16
379#define MAX_STORAGE_TEXTURES_PER_STAGE 8
380#define MAX_STORAGE_BUFFERS_PER_STAGE 8
381#define MAX_UNIFORM_BUFFERS_PER_STAGE 4
382#define MAX_COMPUTE_WRITE_TEXTURES 8
383#define MAX_COMPUTE_WRITE_BUFFERS 8
384#define UNIFORM_BUFFER_SIZE 32768
385#define MAX_VERTEX_BUFFERS 16
386#define MAX_VERTEX_ATTRIBUTES 16
387#define MAX_COLOR_TARGET_BINDINGS 4
388#define MAX_PRESENT_COUNT 16
389#define MAX_FRAMES_IN_FLIGHT 3
390
391// Internal Macros
392
393#define EXPAND_ARRAY_IF_NEEDED(arr, elementType, newCount, capacity, newCapacity) \
394 do { \
395 if ((newCount) >= (capacity)) { \
396 (capacity) = (newCapacity); \
397 (arr) = (elementType *)SDL_realloc( \
398 (arr), \
399 sizeof(elementType) * (capacity)); \
400 } \
401 } while (0)
402
403// Internal Declarations
404
405#ifdef __cplusplus
406extern "C" {
407#endif // __cplusplus
408
409SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline(
410 SDL_GPUDevice *device,
411 SDL_GPUTextureType sourceTextureType,
412 SDL_GPUTextureFormat destinationFormat,
413 SDL_GPUShader *blitVertexShader,
414 SDL_GPUShader *blitFrom2DShader,
415 SDL_GPUShader *blitFrom2DArrayShader,
416 SDL_GPUShader *blitFrom3DShader,
417 SDL_GPUShader *blitFromCubeShader,
418 SDL_GPUShader *blitFromCubeArrayShader,
419 BlitPipelineCacheEntry **blitPipelines,
420 Uint32 *blitPipelineCount,
421 Uint32 *blitPipelineCapacity);
422
423void SDL_GPU_BlitCommon(
424 SDL_GPUCommandBuffer *commandBuffer,
425 const SDL_GPUBlitInfo *info,
426 SDL_GPUSampler *blitLinearSampler,
427 SDL_GPUSampler *blitNearestSampler,
428 SDL_GPUShader *blitVertexShader,
429 SDL_GPUShader *blitFrom2DShader,
430 SDL_GPUShader *blitFrom2DArrayShader,
431 SDL_GPUShader *blitFrom3DShader,
432 SDL_GPUShader *blitFromCubeShader,
433 SDL_GPUShader *blitFromCubeArrayShader,
434 BlitPipelineCacheEntry **blitPipelines,
435 Uint32 *blitPipelineCount,
436 Uint32 *blitPipelineCapacity);
437
438#ifdef __cplusplus
439}
440#endif // __cplusplus
441
442// SDL_GPUDevice Definition
443
444typedef struct SDL_GPURenderer SDL_GPURenderer;
445
446struct SDL_GPUDevice
447{
448 // Quit
449
450 void (*DestroyDevice)(SDL_GPUDevice *device);
451
452 // State Creation
453
454 SDL_GPUComputePipeline *(*CreateComputePipeline)(
455 SDL_GPURenderer *driverData,
456 const SDL_GPUComputePipelineCreateInfo *createinfo);
457
458 SDL_GPUGraphicsPipeline *(*CreateGraphicsPipeline)(
459 SDL_GPURenderer *driverData,
460 const SDL_GPUGraphicsPipelineCreateInfo *createinfo);
461
462 SDL_GPUSampler *(*CreateSampler)(
463 SDL_GPURenderer *driverData,
464 const SDL_GPUSamplerCreateInfo *createinfo);
465
466 SDL_GPUShader *(*CreateShader)(
467 SDL_GPURenderer *driverData,
468 const SDL_GPUShaderCreateInfo *createinfo);
469
470 SDL_GPUTexture *(*CreateTexture)(
471 SDL_GPURenderer *driverData,
472 const SDL_GPUTextureCreateInfo *createinfo);
473
474 SDL_GPUBuffer *(*CreateBuffer)(
475 SDL_GPURenderer *driverData,
476 SDL_GPUBufferUsageFlags usageFlags,
477 Uint32 size);
478
479 SDL_GPUTransferBuffer *(*CreateTransferBuffer)(
480 SDL_GPURenderer *driverData,
481 SDL_GPUTransferBufferUsage usage,
482 Uint32 size);
483
484 // Debug Naming
485
486 void (*SetBufferName)(
487 SDL_GPURenderer *driverData,
488 SDL_GPUBuffer *buffer,
489 const char *text);
490
491 void (*SetTextureName)(
492 SDL_GPURenderer *driverData,
493 SDL_GPUTexture *texture,
494 const char *text);
495
496 void (*InsertDebugLabel)(
497 SDL_GPUCommandBuffer *commandBuffer,
498 const char *text);
499
500 void (*PushDebugGroup)(
501 SDL_GPUCommandBuffer *commandBuffer,
502 const char *name);
503
504 void (*PopDebugGroup)(
505 SDL_GPUCommandBuffer *commandBuffer);
506
507 // Disposal
508
509 void (*ReleaseTexture)(
510 SDL_GPURenderer *driverData,
511 SDL_GPUTexture *texture);
512
513 void (*ReleaseSampler)(
514 SDL_GPURenderer *driverData,
515 SDL_GPUSampler *sampler);
516
517 void (*ReleaseBuffer)(
518 SDL_GPURenderer *driverData,
519 SDL_GPUBuffer *buffer);
520
521 void (*ReleaseTransferBuffer)(
522 SDL_GPURenderer *driverData,
523 SDL_GPUTransferBuffer *transferBuffer);
524
525 void (*ReleaseShader)(
526 SDL_GPURenderer *driverData,
527 SDL_GPUShader *shader);
528
529 void (*ReleaseComputePipeline)(
530 SDL_GPURenderer *driverData,
531 SDL_GPUComputePipeline *computePipeline);
532
533 void (*ReleaseGraphicsPipeline)(
534 SDL_GPURenderer *driverData,
535 SDL_GPUGraphicsPipeline *graphicsPipeline);
536
537 // Render Pass
538
539 void (*BeginRenderPass)(
540 SDL_GPUCommandBuffer *commandBuffer,
541 const SDL_GPUColorTargetInfo *colorTargetInfos,
542 Uint32 numColorTargets,
543 const SDL_GPUDepthStencilTargetInfo *depthStencilTargetInfo);
544
545 void (*BindGraphicsPipeline)(
546 SDL_GPUCommandBuffer *commandBuffer,
547 SDL_GPUGraphicsPipeline *graphicsPipeline);
548
549 void (*SetViewport)(
550 SDL_GPUCommandBuffer *commandBuffer,
551 const SDL_GPUViewport *viewport);
552
553 void (*SetScissor)(
554 SDL_GPUCommandBuffer *commandBuffer,
555 const SDL_Rect *scissor);
556
557 void (*SetBlendConstants)(
558 SDL_GPUCommandBuffer *commandBuffer,
559 SDL_FColor blendConstants);
560
561 void (*SetStencilReference)(
562 SDL_GPUCommandBuffer *commandBuffer,
563 Uint8 reference);
564
565 void (*BindVertexBuffers)(
566 SDL_GPUCommandBuffer *commandBuffer,
567 Uint32 firstSlot,
568 const SDL_GPUBufferBinding *bindings,
569 Uint32 numBindings);
570
571 void (*BindIndexBuffer)(
572 SDL_GPUCommandBuffer *commandBuffer,
573 const SDL_GPUBufferBinding *binding,
574 SDL_GPUIndexElementSize indexElementSize);
575
576 void (*BindVertexSamplers)(
577 SDL_GPUCommandBuffer *commandBuffer,
578 Uint32 firstSlot,
579 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
580 Uint32 numBindings);
581
582 void (*BindVertexStorageTextures)(
583 SDL_GPUCommandBuffer *commandBuffer,
584 Uint32 firstSlot,
585 SDL_GPUTexture *const *storageTextures,
586 Uint32 numBindings);
587
588 void (*BindVertexStorageBuffers)(
589 SDL_GPUCommandBuffer *commandBuffer,
590 Uint32 firstSlot,
591 SDL_GPUBuffer *const *storageBuffers,
592 Uint32 numBindings);
593
594 void (*BindFragmentSamplers)(
595 SDL_GPUCommandBuffer *commandBuffer,
596 Uint32 firstSlot,
597 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
598 Uint32 numBindings);
599
600 void (*BindFragmentStorageTextures)(
601 SDL_GPUCommandBuffer *commandBuffer,
602 Uint32 firstSlot,
603 SDL_GPUTexture *const *storageTextures,
604 Uint32 numBindings);
605
606 void (*BindFragmentStorageBuffers)(
607 SDL_GPUCommandBuffer *commandBuffer,
608 Uint32 firstSlot,
609 SDL_GPUBuffer *const *storageBuffers,
610 Uint32 numBindings);
611
612 void (*PushVertexUniformData)(
613 SDL_GPUCommandBuffer *commandBuffer,
614 Uint32 slotIndex,
615 const void *data,
616 Uint32 length);
617
618 void (*PushFragmentUniformData)(
619 SDL_GPUCommandBuffer *commandBuffer,
620 Uint32 slotIndex,
621 const void *data,
622 Uint32 length);
623
624 void (*DrawIndexedPrimitives)(
625 SDL_GPUCommandBuffer *commandBuffer,
626 Uint32 numIndices,
627 Uint32 numInstances,
628 Uint32 firstIndex,
629 Sint32 vertexOffset,
630 Uint32 firstInstance);
631
632 void (*DrawPrimitives)(
633 SDL_GPUCommandBuffer *commandBuffer,
634 Uint32 numVertices,
635 Uint32 numInstances,
636 Uint32 firstVertex,
637 Uint32 firstInstance);
638
639 void (*DrawPrimitivesIndirect)(
640 SDL_GPUCommandBuffer *commandBuffer,
641 SDL_GPUBuffer *buffer,
642 Uint32 offset,
643 Uint32 drawCount);
644
645 void (*DrawIndexedPrimitivesIndirect)(
646 SDL_GPUCommandBuffer *commandBuffer,
647 SDL_GPUBuffer *buffer,
648 Uint32 offset,
649 Uint32 drawCount);
650
651 void (*EndRenderPass)(
652 SDL_GPUCommandBuffer *commandBuffer);
653
654 // Compute Pass
655
656 void (*BeginComputePass)(
657 SDL_GPUCommandBuffer *commandBuffer,
658 const SDL_GPUStorageTextureReadWriteBinding *storageTextureBindings,
659 Uint32 numStorageTextureBindings,
660 const SDL_GPUStorageBufferReadWriteBinding *storageBufferBindings,
661 Uint32 numStorageBufferBindings);
662
663 void (*BindComputePipeline)(
664 SDL_GPUCommandBuffer *commandBuffer,
665 SDL_GPUComputePipeline *computePipeline);
666
667 void (*BindComputeSamplers)(
668 SDL_GPUCommandBuffer *commandBuffer,
669 Uint32 firstSlot,
670 const SDL_GPUTextureSamplerBinding *textureSamplerBindings,
671 Uint32 numBindings);
672
673 void (*BindComputeStorageTextures)(
674 SDL_GPUCommandBuffer *commandBuffer,
675 Uint32 firstSlot,
676 SDL_GPUTexture *const *storageTextures,
677 Uint32 numBindings);
678
679 void (*BindComputeStorageBuffers)(
680 SDL_GPUCommandBuffer *commandBuffer,
681 Uint32 firstSlot,
682 SDL_GPUBuffer *const *storageBuffers,
683 Uint32 numBindings);
684
685 void (*PushComputeUniformData)(
686 SDL_GPUCommandBuffer *commandBuffer,
687 Uint32 slotIndex,
688 const void *data,
689 Uint32 length);
690
691 void (*DispatchCompute)(
692 SDL_GPUCommandBuffer *commandBuffer,
693 Uint32 groupcountX,
694 Uint32 groupcountY,
695 Uint32 groupcountZ);
696
697 void (*DispatchComputeIndirect)(
698 SDL_GPUCommandBuffer *commandBuffer,
699 SDL_GPUBuffer *buffer,
700 Uint32 offset);
701
702 void (*EndComputePass)(
703 SDL_GPUCommandBuffer *commandBuffer);
704
705 // TransferBuffer Data
706
707 void *(*MapTransferBuffer)(
708 SDL_GPURenderer *device,
709 SDL_GPUTransferBuffer *transferBuffer,
710 bool cycle);
711
712 void (*UnmapTransferBuffer)(
713 SDL_GPURenderer *device,
714 SDL_GPUTransferBuffer *transferBuffer);
715
716 // Copy Pass
717
718 void (*BeginCopyPass)(
719 SDL_GPUCommandBuffer *commandBuffer);
720
721 void (*UploadToTexture)(
722 SDL_GPUCommandBuffer *commandBuffer,
723 const SDL_GPUTextureTransferInfo *source,
724 const SDL_GPUTextureRegion *destination,
725 bool cycle);
726
727 void (*UploadToBuffer)(
728 SDL_GPUCommandBuffer *commandBuffer,
729 const SDL_GPUTransferBufferLocation *source,
730 const SDL_GPUBufferRegion *destination,
731 bool cycle);
732
733 void (*CopyTextureToTexture)(
734 SDL_GPUCommandBuffer *commandBuffer,
735 const SDL_GPUTextureLocation *source,
736 const SDL_GPUTextureLocation *destination,
737 Uint32 w,
738 Uint32 h,
739 Uint32 d,
740 bool cycle);
741
742 void (*CopyBufferToBuffer)(
743 SDL_GPUCommandBuffer *commandBuffer,
744 const SDL_GPUBufferLocation *source,
745 const SDL_GPUBufferLocation *destination,
746 Uint32 size,
747 bool cycle);
748
749 void (*GenerateMipmaps)(
750 SDL_GPUCommandBuffer *commandBuffer,
751 SDL_GPUTexture *texture);
752
753 void (*DownloadFromTexture)(
754 SDL_GPUCommandBuffer *commandBuffer,
755 const SDL_GPUTextureRegion *source,
756 const SDL_GPUTextureTransferInfo *destination);
757
758 void (*DownloadFromBuffer)(
759 SDL_GPUCommandBuffer *commandBuffer,
760 const SDL_GPUBufferRegion *source,
761 const SDL_GPUTransferBufferLocation *destination);
762
763 void (*EndCopyPass)(
764 SDL_GPUCommandBuffer *commandBuffer);
765
766 void (*Blit)(
767 SDL_GPUCommandBuffer *commandBuffer,
768 const SDL_GPUBlitInfo *info);
769
770 // Submission/Presentation
771
772 bool (*SupportsSwapchainComposition)(
773 SDL_GPURenderer *driverData,
774 SDL_Window *window,
775 SDL_GPUSwapchainComposition swapchainComposition);
776
777 bool (*SupportsPresentMode)(
778 SDL_GPURenderer *driverData,
779 SDL_Window *window,
780 SDL_GPUPresentMode presentMode);
781
782 bool (*ClaimWindow)(
783 SDL_GPURenderer *driverData,
784 SDL_Window *window);
785
786 void (*ReleaseWindow)(
787 SDL_GPURenderer *driverData,
788 SDL_Window *window);
789
790 bool (*SetSwapchainParameters)(
791 SDL_GPURenderer *driverData,
792 SDL_Window *window,
793 SDL_GPUSwapchainComposition swapchainComposition,
794 SDL_GPUPresentMode presentMode);
795
796 bool (*SetAllowedFramesInFlight)(
797 SDL_GPURenderer *driverData,
798 Uint32 allowedFramesInFlight);
799
800 SDL_GPUTextureFormat (*GetSwapchainTextureFormat)(
801 SDL_GPURenderer *driverData,
802 SDL_Window *window);
803
804 SDL_GPUCommandBuffer *(*AcquireCommandBuffer)(
805 SDL_GPURenderer *driverData);
806
807 bool (*AcquireSwapchainTexture)(
808 SDL_GPUCommandBuffer *commandBuffer,
809 SDL_Window *window,
810 SDL_GPUTexture **swapchainTexture,
811 Uint32 *swapchainTextureWidth,
812 Uint32 *swapchainTextureHeight);
813
814 bool (*WaitForSwapchain)(
815 SDL_GPURenderer *driverData,
816 SDL_Window *window);
817
818 bool (*WaitAndAcquireSwapchainTexture)(
819 SDL_GPUCommandBuffer *commandBuffer,
820 SDL_Window *window,
821 SDL_GPUTexture **swapchainTexture,
822 Uint32 *swapchainTextureWidth,
823 Uint32 *swapchainTextureHeight);
824
825 bool (*Submit)(
826 SDL_GPUCommandBuffer *commandBuffer);
827
828 SDL_GPUFence *(*SubmitAndAcquireFence)(
829 SDL_GPUCommandBuffer *commandBuffer);
830
831 bool (*Cancel)(
832 SDL_GPUCommandBuffer *commandBuffer);
833
834 bool (*Wait)(
835 SDL_GPURenderer *driverData);
836
837 bool (*WaitForFences)(
838 SDL_GPURenderer *driverData,
839 bool waitAll,
840 SDL_GPUFence *const *fences,
841 Uint32 numFences);
842
843 bool (*QueryFence)(
844 SDL_GPURenderer *driverData,
845 SDL_GPUFence *fence);
846
847 void (*ReleaseFence)(
848 SDL_GPURenderer *driverData,
849 SDL_GPUFence *fence);
850
851 // Feature Queries
852
853 bool (*SupportsTextureFormat)(
854 SDL_GPURenderer *driverData,
855 SDL_GPUTextureFormat format,
856 SDL_GPUTextureType type,
857 SDL_GPUTextureUsageFlags usage);
858
859 bool (*SupportsSampleCount)(
860 SDL_GPURenderer *driverData,
861 SDL_GPUTextureFormat format,
862 SDL_GPUSampleCount desiredSampleCount);
863
864 // Opaque pointer for the Driver
865 SDL_GPURenderer *driverData;
866
867 // Store this for SDL_GetGPUDeviceDriver()
868 const char *backend;
869
870 // Store this for SDL_GetGPUShaderFormats()
871 SDL_GPUShaderFormat shader_formats;
872
873 // Store this for SDL_gpu.c's debug layer
874 bool debug_mode;
875};
876
877#define ASSIGN_DRIVER_FUNC(func, name) \
878 result->func = name##_##func;
879#define ASSIGN_DRIVER(name) \
880 ASSIGN_DRIVER_FUNC(DestroyDevice, name) \
881 ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \
882 ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \
883 ASSIGN_DRIVER_FUNC(CreateSampler, name) \
884 ASSIGN_DRIVER_FUNC(CreateShader, name) \
885 ASSIGN_DRIVER_FUNC(CreateTexture, name) \
886 ASSIGN_DRIVER_FUNC(CreateBuffer, name) \
887 ASSIGN_DRIVER_FUNC(CreateTransferBuffer, name) \
888 ASSIGN_DRIVER_FUNC(SetBufferName, name) \
889 ASSIGN_DRIVER_FUNC(SetTextureName, name) \
890 ASSIGN_DRIVER_FUNC(InsertDebugLabel, name) \
891 ASSIGN_DRIVER_FUNC(PushDebugGroup, name) \
892 ASSIGN_DRIVER_FUNC(PopDebugGroup, name) \
893 ASSIGN_DRIVER_FUNC(ReleaseTexture, name) \
894 ASSIGN_DRIVER_FUNC(ReleaseSampler, name) \
895 ASSIGN_DRIVER_FUNC(ReleaseBuffer, name) \
896 ASSIGN_DRIVER_FUNC(ReleaseTransferBuffer, name) \
897 ASSIGN_DRIVER_FUNC(ReleaseShader, name) \
898 ASSIGN_DRIVER_FUNC(ReleaseComputePipeline, name) \
899 ASSIGN_DRIVER_FUNC(ReleaseGraphicsPipeline, name) \
900 ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \
901 ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \
902 ASSIGN_DRIVER_FUNC(SetViewport, name) \
903 ASSIGN_DRIVER_FUNC(SetScissor, name) \
904 ASSIGN_DRIVER_FUNC(SetBlendConstants, name) \
905 ASSIGN_DRIVER_FUNC(SetStencilReference, name) \
906 ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \
907 ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \
908 ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \
909 ASSIGN_DRIVER_FUNC(BindVertexStorageTextures, name) \
910 ASSIGN_DRIVER_FUNC(BindVertexStorageBuffers, name) \
911 ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \
912 ASSIGN_DRIVER_FUNC(BindFragmentStorageTextures, name) \
913 ASSIGN_DRIVER_FUNC(BindFragmentStorageBuffers, name) \
914 ASSIGN_DRIVER_FUNC(PushVertexUniformData, name) \
915 ASSIGN_DRIVER_FUNC(PushFragmentUniformData, name) \
916 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \
917 ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \
918 ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \
919 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitivesIndirect, name) \
920 ASSIGN_DRIVER_FUNC(EndRenderPass, name) \
921 ASSIGN_DRIVER_FUNC(BeginComputePass, name) \
922 ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \
923 ASSIGN_DRIVER_FUNC(BindComputeSamplers, name) \
924 ASSIGN_DRIVER_FUNC(BindComputeStorageTextures, name) \
925 ASSIGN_DRIVER_FUNC(BindComputeStorageBuffers, name) \
926 ASSIGN_DRIVER_FUNC(PushComputeUniformData, name) \
927 ASSIGN_DRIVER_FUNC(DispatchCompute, name) \
928 ASSIGN_DRIVER_FUNC(DispatchComputeIndirect, name) \
929 ASSIGN_DRIVER_FUNC(EndComputePass, name) \
930 ASSIGN_DRIVER_FUNC(MapTransferBuffer, name) \
931 ASSIGN_DRIVER_FUNC(UnmapTransferBuffer, name) \
932 ASSIGN_DRIVER_FUNC(BeginCopyPass, name) \
933 ASSIGN_DRIVER_FUNC(UploadToTexture, name) \
934 ASSIGN_DRIVER_FUNC(UploadToBuffer, name) \
935 ASSIGN_DRIVER_FUNC(DownloadFromTexture, name) \
936 ASSIGN_DRIVER_FUNC(DownloadFromBuffer, name) \
937 ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \
938 ASSIGN_DRIVER_FUNC(CopyBufferToBuffer, name) \
939 ASSIGN_DRIVER_FUNC(GenerateMipmaps, name) \
940 ASSIGN_DRIVER_FUNC(EndCopyPass, name) \
941 ASSIGN_DRIVER_FUNC(Blit, name) \
942 ASSIGN_DRIVER_FUNC(SupportsSwapchainComposition, name) \
943 ASSIGN_DRIVER_FUNC(SupportsPresentMode, name) \
944 ASSIGN_DRIVER_FUNC(ClaimWindow, name) \
945 ASSIGN_DRIVER_FUNC(ReleaseWindow, name) \
946 ASSIGN_DRIVER_FUNC(SetSwapchainParameters, name) \
947 ASSIGN_DRIVER_FUNC(SetAllowedFramesInFlight, name) \
948 ASSIGN_DRIVER_FUNC(GetSwapchainTextureFormat, name) \
949 ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \
950 ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \
951 ASSIGN_DRIVER_FUNC(WaitForSwapchain, name) \
952 ASSIGN_DRIVER_FUNC(WaitAndAcquireSwapchainTexture, name)\
953 ASSIGN_DRIVER_FUNC(Submit, name) \
954 ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \
955 ASSIGN_DRIVER_FUNC(Cancel, name) \
956 ASSIGN_DRIVER_FUNC(Wait, name) \
957 ASSIGN_DRIVER_FUNC(WaitForFences, name) \
958 ASSIGN_DRIVER_FUNC(QueryFence, name) \
959 ASSIGN_DRIVER_FUNC(ReleaseFence, name) \
960 ASSIGN_DRIVER_FUNC(SupportsTextureFormat, name) \
961 ASSIGN_DRIVER_FUNC(SupportsSampleCount, name)
962
963typedef struct SDL_GPUBootstrap
964{
965 const char *name;
966 const SDL_GPUShaderFormat shader_formats;
967 bool (*PrepareDriver)(SDL_VideoDevice *_this);
968 SDL_GPUDevice *(*CreateDevice)(bool debug_mode, bool prefer_low_power, SDL_PropertiesID props);
969} SDL_GPUBootstrap;
970
971#ifdef __cplusplus
972extern "C" {
973#endif
974
975extern SDL_GPUBootstrap VulkanDriver;
976extern SDL_GPUBootstrap D3D12Driver;
977extern SDL_GPUBootstrap MetalDriver;
978extern SDL_GPUBootstrap PS5Driver;
979
980#ifdef __cplusplus
981}
982#endif
983
984#endif // SDL_GPU_DRIVER_H