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 | |
29 | typedef struct Pass |
30 | { |
31 | SDL_GPUCommandBuffer *command_buffer; |
32 | bool in_progress; |
33 | } Pass; |
34 | |
35 | typedef 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 | |
47 | typedef struct |
48 | { |
49 | SDL_GPUTextureCreateInfo ; |
50 | } ; |
51 | |
52 | typedef 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 | |
64 | typedef 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 | |
82 | static 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 | |
203 | static 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 | |
324 | static 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 | |
340 | static 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 | |
353 | static 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 | |
376 | static inline Uint32 IndexSize(SDL_GPUIndexElementSize size) |
377 | { |
378 | return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4; |
379 | } |
380 | |
381 | static 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 |
420 | extern "C" { |
421 | #endif // __cplusplus |
422 | |
423 | SDL_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 | |
437 | void 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 | |
458 | typedef struct SDL_GPURenderer SDL_GPURenderer; |
459 | |
460 | struct 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 | |
979 | typedef 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 |
988 | extern "C" { |
989 | #endif |
990 | |
991 | extern SDL_GPUBootstrap VulkanDriver; |
992 | extern SDL_GPUBootstrap D3D12Driver; |
993 | extern SDL_GPUBootstrap MetalDriver; |
994 | extern SDL_GPUBootstrap PrivateGPUDriver; |
995 | |
996 | #ifdef __cplusplus |
997 | } |
998 | #endif |
999 | |
1000 | #endif // SDL_GPU_DRIVER_H |
1001 | |