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