Atlas - SDL_sysgpu.h

Home / ext / SDL / src / gpu Lines: 1 | Size: 45313 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2026 Sam Lantinga <[email protected]> 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#include <SDL3/SDL_openxr.h> 28 29// GraphicsDevice Limits 30 31#define MAX_TEXTURE_SAMPLERS_PER_STAGE 16 32#define MAX_STORAGE_TEXTURES_PER_STAGE 8 33#define MAX_STORAGE_BUFFERS_PER_STAGE 8 34#define MAX_UNIFORM_BUFFERS_PER_STAGE 4 35#define MAX_COMPUTE_WRITE_TEXTURES 8 36#define MAX_COMPUTE_WRITE_BUFFERS 8 37#define UNIFORM_BUFFER_SIZE 32768 38#define MAX_VERTEX_BUFFERS 16 39#define MAX_VERTEX_ATTRIBUTES 16 40#define MAX_COLOR_TARGET_BINDINGS 8 41#define MAX_PRESENT_COUNT 16 42#define MAX_FRAMES_IN_FLIGHT 3 43 44// Common Structs 45 46typedef struct Pass 47{ 48 SDL_GPUCommandBuffer *command_buffer; 49 bool in_progress; 50} Pass; 51 52typedef struct ComputePass 53{ 54 SDL_GPUCommandBuffer *command_buffer; 55 bool in_progress; 56 57 SDL_GPUComputePipeline *compute_pipeline; 58 59 bool sampler_bound[MAX_TEXTURE_SAMPLERS_PER_STAGE]; 60 bool read_only_storage_texture_bound[MAX_STORAGE_TEXTURES_PER_STAGE]; 61 bool read_only_storage_buffer_bound[MAX_STORAGE_BUFFERS_PER_STAGE]; 62 bool read_write_storage_texture_bound[MAX_COMPUTE_WRITE_TEXTURES]; 63 bool read_write_storage_buffer_bound[MAX_COMPUTE_WRITE_BUFFERS]; 64} ComputePass; 65 66typedef struct RenderPass 67{ 68 SDL_GPUCommandBuffer *command_buffer; 69 bool in_progress; 70 SDL_GPUTexture *color_targets[MAX_COLOR_TARGET_BINDINGS]; 71 Uint32 num_color_targets; 72 SDL_GPUTexture *depth_stencil_target; 73 74 SDL_GPUGraphicsPipeline *graphics_pipeline; 75 76 bool vertex_sampler_bound[MAX_TEXTURE_SAMPLERS_PER_STAGE]; 77 bool vertex_storage_texture_bound[MAX_STORAGE_TEXTURES_PER_STAGE]; 78 bool vertex_storage_buffer_bound[MAX_STORAGE_BUFFERS_PER_STAGE]; 79 80 bool fragment_sampler_bound[MAX_TEXTURE_SAMPLERS_PER_STAGE]; 81 bool fragment_storage_texture_bound[MAX_STORAGE_TEXTURES_PER_STAGE]; 82 bool fragment_storage_buffer_bound[MAX_STORAGE_BUFFERS_PER_STAGE]; 83} RenderPass; 84 85typedef struct CommandBufferCommonHeader 86{ 87 SDL_GPUDevice *device; 88 89 RenderPass render_pass; 90 ComputePass compute_pass; 91 92 Pass copy_pass; 93 bool swapchain_texture_acquired; 94 bool submitted; 95 // used to avoid tripping assert on GenerateMipmaps 96 bool ignore_render_pass_texture_validation; 97} CommandBufferCommonHeader; 98 99typedef struct TextureCommonHeader 100{ 101 SDL_GPUTextureCreateInfo info; 102} TextureCommonHeader; 103 104typedef struct GraphicsPipelineCommonHeader 105{ 106 Uint32 num_vertex_samplers; 107 Uint32 num_vertex_storage_textures; 108 Uint32 num_vertex_storage_buffers; 109 Uint32 num_vertex_uniform_buffers; 110 111 Uint32 num_fragment_samplers; 112 Uint32 num_fragment_storage_textures; 113 Uint32 num_fragment_storage_buffers; 114 Uint32 num_fragment_uniform_buffers; 115} GraphicsPipelineCommonHeader; 116 117typedef struct ComputePipelineCommonHeader 118{ 119 Uint32 numSamplers; 120 Uint32 numReadonlyStorageTextures; 121 Uint32 numReadonlyStorageBuffers; 122 Uint32 numReadWriteStorageTextures; 123 Uint32 numReadWriteStorageBuffers; 124 Uint32 numUniformBuffers; 125} ComputePipelineCommonHeader; 126 127typedef struct BlitFragmentUniforms 128{ 129 // texcoord space 130 float left; 131 float top; 132 float width; 133 float height; 134 135 Uint32 mip_level; 136 float layer_or_depth; 137} BlitFragmentUniforms; 138 139typedef struct BlitPipelineCacheEntry 140{ 141 SDL_GPUTextureType type; 142 SDL_GPUTextureFormat format; 143 SDL_GPUGraphicsPipeline *pipeline; 144} BlitPipelineCacheEntry; 145 146// Internal Helper Utilities 147 148#define SDL_GPU_TEXTUREFORMAT_MAX_ENUM_VALUE (SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT + 1) 149#define SDL_GPU_VERTEXELEMENTFORMAT_MAX_ENUM_VALUE (SDL_GPU_VERTEXELEMENTFORMAT_HALF4 + 1) 150#define SDL_GPU_COMPAREOP_MAX_ENUM_VALUE (SDL_GPU_COMPAREOP_ALWAYS + 1) 151#define SDL_GPU_STENCILOP_MAX_ENUM_VALUE (SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + 1) 152#define SDL_GPU_BLENDOP_MAX_ENUM_VALUE (SDL_GPU_BLENDOP_MAX + 1) 153#define SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE (SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + 1) 154#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 + 1) 155#define SDL_GPU_PRESENTMODE_MAX_ENUM_VALUE (SDL_GPU_PRESENTMODE_MAILBOX + 1) 156 157static inline Sint32 Texture_GetBlockWidth( 158 SDL_GPUTextureFormat format) 159{ 160 switch (format) { 161 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM: 162 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM: 163 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB: 164 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB: 165 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT: 166 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT: 167 return 12; 168 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM: 169 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM: 170 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM: 171 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM: 172 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB: 173 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB: 174 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB: 175 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB: 176 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT: 177 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT: 178 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT: 179 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT: 180 return 10; 181 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM: 182 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM: 183 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM: 184 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB: 185 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB: 186 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB: 187 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT: 188 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT: 189 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT: 190 return 8; 191 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM: 192 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM: 193 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB: 194 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB: 195 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT: 196 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT: 197 return 6; 198 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM: 199 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM: 200 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB: 201 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB: 202 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT: 203 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT: 204 return 5; 205 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: 206 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: 207 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: 208 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: 209 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: 210 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: 211 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: 212 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: 213 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: 214 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: 215 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: 216 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: 217 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM: 218 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB: 219 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT: 220 return 4; 221 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: 222 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM: 223 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM: 224 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: 225 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM: 226 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: 227 case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM: 228 case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM: 229 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: 230 case SDL_GPU_TEXTUREFORMAT_R8_UNORM: 231 case SDL_GPU_TEXTUREFORMAT_R16_UNORM: 232 case SDL_GPU_TEXTUREFORMAT_A8_UNORM: 233 case SDL_GPU_TEXTUREFORMAT_R8_SNORM: 234 case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM: 235 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: 236 case SDL_GPU_TEXTUREFORMAT_R16_SNORM: 237 case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM: 238 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: 239 case SDL_GPU_TEXTUREFORMAT_R16_FLOAT: 240 case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT: 241 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: 242 case SDL_GPU_TEXTUREFORMAT_R32_FLOAT: 243 case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT: 244 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT: 245 case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT: 246 case SDL_GPU_TEXTUREFORMAT_R8_UINT: 247 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT: 248 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: 249 case SDL_GPU_TEXTUREFORMAT_R16_UINT: 250 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: 251 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: 252 case SDL_GPU_TEXTUREFORMAT_R32_UINT: 253 case SDL_GPU_TEXTUREFORMAT_R32G32_UINT: 254 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT: 255 case SDL_GPU_TEXTUREFORMAT_R8_INT: 256 case SDL_GPU_TEXTUREFORMAT_R8G8_INT: 257 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: 258 case SDL_GPU_TEXTUREFORMAT_R16_INT: 259 case SDL_GPU_TEXTUREFORMAT_R16G16_INT: 260 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: 261 case SDL_GPU_TEXTUREFORMAT_R32_INT: 262 case SDL_GPU_TEXTUREFORMAT_R32G32_INT: 263 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT: 264 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB: 265 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: 266 case SDL_GPU_TEXTUREFORMAT_D16_UNORM: 267 case SDL_GPU_TEXTUREFORMAT_D24_UNORM: 268 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT: 269 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT: 270 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT: 271 return 1; 272 default: 273 SDL_assert_release(!"Unrecognized TextureFormat!"); 274 return 0; 275 } 276} 277 278static inline Sint32 Texture_GetBlockHeight( 279 SDL_GPUTextureFormat format) 280{ 281 switch (format) { 282 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM: 283 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB: 284 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT: 285 return 12; 286 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM: 287 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB: 288 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT: 289 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM: 290 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB: 291 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT: 292 return 10; 293 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM: 294 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB: 295 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT: 296 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM: 297 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB: 298 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT: 299 return 8; 300 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM: 301 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB: 302 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT: 303 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM: 304 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB: 305 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT: 306 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM: 307 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB: 308 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT: 309 return 6; 310 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM: 311 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB: 312 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT: 313 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM: 314 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB: 315 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT: 316 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM: 317 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB: 318 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT: 319 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM: 320 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB: 321 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT: 322 return 5; 323 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: 324 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: 325 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: 326 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: 327 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: 328 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: 329 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: 330 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: 331 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: 332 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: 333 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: 334 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: 335 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM: 336 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB: 337 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT: 338 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM: 339 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB: 340 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT: 341 return 4; 342 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: 343 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM: 344 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM: 345 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: 346 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM: 347 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: 348 case SDL_GPU_TEXTUREFORMAT_R8G8_UNORM: 349 case SDL_GPU_TEXTUREFORMAT_R16G16_UNORM: 350 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: 351 case SDL_GPU_TEXTUREFORMAT_R8_UNORM: 352 case SDL_GPU_TEXTUREFORMAT_R16_UNORM: 353 case SDL_GPU_TEXTUREFORMAT_A8_UNORM: 354 case SDL_GPU_TEXTUREFORMAT_R8_SNORM: 355 case SDL_GPU_TEXTUREFORMAT_R8G8_SNORM: 356 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: 357 case SDL_GPU_TEXTUREFORMAT_R16_SNORM: 358 case SDL_GPU_TEXTUREFORMAT_R16G16_SNORM: 359 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: 360 case SDL_GPU_TEXTUREFORMAT_R16_FLOAT: 361 case SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT: 362 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: 363 case SDL_GPU_TEXTUREFORMAT_R32_FLOAT: 364 case SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT: 365 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT: 366 case SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT: 367 case SDL_GPU_TEXTUREFORMAT_R8_UINT: 368 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT: 369 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: 370 case SDL_GPU_TEXTUREFORMAT_R16_UINT: 371 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: 372 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: 373 case SDL_GPU_TEXTUREFORMAT_R32_UINT: 374 case SDL_GPU_TEXTUREFORMAT_R32G32_UINT: 375 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT: 376 case SDL_GPU_TEXTUREFORMAT_R8_INT: 377 case SDL_GPU_TEXTUREFORMAT_R8G8_INT: 378 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: 379 case SDL_GPU_TEXTUREFORMAT_R16_INT: 380 case SDL_GPU_TEXTUREFORMAT_R16G16_INT: 381 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: 382 case SDL_GPU_TEXTUREFORMAT_R32_INT: 383 case SDL_GPU_TEXTUREFORMAT_R32G32_INT: 384 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT: 385 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB: 386 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: 387 case SDL_GPU_TEXTUREFORMAT_D16_UNORM: 388 case SDL_GPU_TEXTUREFORMAT_D24_UNORM: 389 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT: 390 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT: 391 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT: 392 return 1; 393 default: 394 SDL_assert_release(!"Unrecognized TextureFormat!"); 395 return 0; 396 } 397} 398 399static inline bool IsDepthFormat( 400 SDL_GPUTextureFormat format) 401{ 402 switch (format) { 403 case SDL_GPU_TEXTUREFORMAT_D16_UNORM: 404 case SDL_GPU_TEXTUREFORMAT_D24_UNORM: 405 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT: 406 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT: 407 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT: 408 return true; 409 410 default: 411 return false; 412 } 413} 414 415static inline bool IsStencilFormat( 416 SDL_GPUTextureFormat format) 417{ 418 switch (format) { 419 case SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT: 420 case SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT: 421 return true; 422 423 default: 424 return false; 425 } 426} 427 428static inline bool IsIntegerFormat( 429 SDL_GPUTextureFormat format) 430{ 431 switch (format) { 432 case SDL_GPU_TEXTUREFORMAT_R8_UINT: 433 case SDL_GPU_TEXTUREFORMAT_R8G8_UINT: 434 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: 435 case SDL_GPU_TEXTUREFORMAT_R16_UINT: 436 case SDL_GPU_TEXTUREFORMAT_R16G16_UINT: 437 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: 438 case SDL_GPU_TEXTUREFORMAT_R8_INT: 439 case SDL_GPU_TEXTUREFORMAT_R8G8_INT: 440 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: 441 case SDL_GPU_TEXTUREFORMAT_R16_INT: 442 case SDL_GPU_TEXTUREFORMAT_R16G16_INT: 443 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: 444 return true; 445 446 default: 447 return false; 448 } 449} 450 451static inline bool IsCompressedFormat( 452 SDL_GPUTextureFormat format) 453{ 454 switch (format) { 455 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: 456 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: 457 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: 458 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: 459 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: 460 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: 461 case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: 462 case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: 463 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: 464 case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: 465 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: 466 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: 467 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM: 468 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM: 469 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM: 470 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM: 471 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM: 472 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM: 473 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM: 474 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM: 475 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM: 476 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM: 477 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM: 478 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM: 479 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM: 480 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM: 481 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB: 482 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB: 483 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB: 484 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB: 485 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB: 486 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB: 487 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB: 488 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB: 489 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB: 490 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB: 491 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB: 492 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB: 493 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB: 494 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB: 495 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT: 496 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT: 497 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT: 498 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT: 499 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT: 500 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT: 501 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT: 502 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT: 503 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT: 504 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT: 505 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT: 506 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT: 507 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT: 508 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT: 509 return true; 510 511 default: 512 return false; 513 } 514} 515 516static inline bool FormatHasAlpha( 517 SDL_GPUTextureFormat format) 518{ 519 switch (format) { 520 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM: 521 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM: 522 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB: 523 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB: 524 case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT: 525 case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT: 526 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM: 527 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM: 528 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM: 529 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM: 530 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB: 531 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB: 532 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB: 533 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB: 534 case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT: 535 case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT: 536 case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT: 537 case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT: 538 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM: 539 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM: 540 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM: 541 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB: 542 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB: 543 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB: 544 case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT: 545 case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT: 546 case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT: 547 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM: 548 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM: 549 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB: 550 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB: 551 case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT: 552 case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT: 553 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM: 554 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM: 555 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB: 556 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB: 557 case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT: 558 case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT: 559 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM: 560 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB: 561 case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT: 562 // ASTC textures may or may not have alpha; return true as this is mainly intended for validation 563 return true; 564 565 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: 566 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: 567 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: 568 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: 569 case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: 570 case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: 571 case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: 572 case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: 573 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: 574 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM: 575 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: 576 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM: 577 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: 578 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: 579 case SDL_GPU_TEXTUREFORMAT_A8_UNORM: 580 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: 581 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: 582 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: 583 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT: 584 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: 585 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: 586 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT: 587 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: 588 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: 589 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT: 590 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB: 591 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: 592 return true; 593 594 default: 595 return false; 596 } 597} 598 599static inline Uint32 IndexSize(SDL_GPUIndexElementSize size) 600{ 601 return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4; 602} 603 604static inline Uint32 BytesPerRow( 605 Sint32 width, 606 SDL_GPUTextureFormat format) 607{ 608 Uint32 blockWidth = Texture_GetBlockWidth(format); 609 Uint32 blocksPerRow = (width + blockWidth - 1) / blockWidth; 610 return blocksPerRow * SDL_GPUTextureFormatTexelBlockSize(format); 611} 612 613// Internal Macros 614 615#define EXPAND_ARRAY_IF_NEEDED(arr, elementType, newCount, capacity, newCapacity) \ 616 do { \ 617 if ((newCount) >= (capacity)) { \ 618 (capacity) = (newCapacity); \ 619 (arr) = (elementType *)SDL_realloc( \ 620 (arr), \ 621 sizeof(elementType) * (capacity)); \ 622 } \ 623 } while (0) 624 625// Internal Declarations 626 627#ifdef __cplusplus 628extern "C" { 629#endif // __cplusplus 630 631SDL_GPUGraphicsPipeline *SDL_GPU_FetchBlitPipeline( 632 SDL_GPUDevice *device, 633 SDL_GPUTextureType sourceTextureType, 634 SDL_GPUTextureFormat destinationFormat, 635 SDL_GPUShader *blitVertexShader, 636 SDL_GPUShader *blitFrom2DShader, 637 SDL_GPUShader *blitFrom2DArrayShader, 638 SDL_GPUShader *blitFrom3DShader, 639 SDL_GPUShader *blitFromCubeShader, 640 SDL_GPUShader *blitFromCubeArrayShader, 641 BlitPipelineCacheEntry **blitPipelines, 642 Uint32 *blitPipelineCount, 643 Uint32 *blitPipelineCapacity); 644 645void SDL_GPU_BlitCommon( 646 SDL_GPUCommandBuffer *commandBuffer, 647 const SDL_GPUBlitInfo *info, 648 SDL_GPUSampler *blitLinearSampler, 649 SDL_GPUSampler *blitNearestSampler, 650 SDL_GPUShader *blitVertexShader, 651 SDL_GPUShader *blitFrom2DShader, 652 SDL_GPUShader *blitFrom2DArrayShader, 653 SDL_GPUShader *blitFrom3DShader, 654 SDL_GPUShader *blitFromCubeShader, 655 SDL_GPUShader *blitFromCubeArrayShader, 656 BlitPipelineCacheEntry **blitPipelines, 657 Uint32 *blitPipelineCount, 658 Uint32 *blitPipelineCapacity); 659 660#ifdef __cplusplus 661} 662#endif // __cplusplus 663 664// SDL_GPUDevice Definition 665 666typedef struct SDL_GPURenderer SDL_GPURenderer; 667 668struct SDL_GPUDevice 669{ 670 // Device 671 672 void (*DestroyDevice)(SDL_GPUDevice *device); 673 674 XrResult (*DestroyXRSwapchain)( 675 SDL_GPURenderer *device, 676 XrSwapchain swapchain, 677 SDL_GPUTexture **swapchainImages); 678 679 SDL_PropertiesID (*GetDeviceProperties)(SDL_GPUDevice *device); 680 681 // State Creation 682 683 SDL_GPUComputePipeline *(*CreateComputePipeline)( 684 SDL_GPURenderer *driverData, 685 const SDL_GPUComputePipelineCreateInfo *createinfo); 686 687 SDL_GPUGraphicsPipeline *(*CreateGraphicsPipeline)( 688 SDL_GPURenderer *driverData, 689 const SDL_GPUGraphicsPipelineCreateInfo *createinfo); 690 691 SDL_GPUSampler *(*CreateSampler)( 692 SDL_GPURenderer *driverData, 693 const SDL_GPUSamplerCreateInfo *createinfo); 694 695 SDL_GPUShader *(*CreateShader)( 696 SDL_GPURenderer *driverData, 697 const SDL_GPUShaderCreateInfo *createinfo); 698 699 SDL_GPUTexture *(*CreateTexture)( 700 SDL_GPURenderer *driverData, 701 const SDL_GPUTextureCreateInfo *createinfo); 702 703 SDL_GPUBuffer *(*CreateBuffer)( 704 SDL_GPURenderer *driverData, 705 SDL_GPUBufferUsageFlags usageFlags, 706 Uint32 size, 707 const char *debugName); 708 709 SDL_GPUTransferBuffer *(*CreateTransferBuffer)( 710 SDL_GPURenderer *driverData, 711 SDL_GPUTransferBufferUsage usage, 712 Uint32 size, 713 const char *debugName); 714 715 XrResult (*CreateXRSession)( 716 SDL_GPURenderer *driverData, 717 const XrSessionCreateInfo *createinfo, 718 XrSession *session); 719 720 SDL_GPUTextureFormat* (*GetXRSwapchainFormats)( 721 SDL_GPURenderer *driverData, 722 XrSession session, 723 int *num_formats); 724 725 XrResult (*CreateXRSwapchain)( 726 SDL_GPURenderer *driverData, 727 XrSession session, 728 const XrSwapchainCreateInfo *createinfo, 729 SDL_GPUTextureFormat format, 730 XrSwapchain *swapchain, 731 SDL_GPUTexture ***textures); 732 733 // Debug Naming 734 735 void (*SetBufferName)( 736 SDL_GPURenderer *driverData, 737 SDL_GPUBuffer *buffer, 738 const char *text); 739 740 void (*SetTextureName)( 741 SDL_GPURenderer *driverData, 742 SDL_GPUTexture *texture, 743 const char *text); 744 745 void (*InsertDebugLabel)( 746 SDL_GPUCommandBuffer *commandBuffer, 747 const char *text); 748 749 void (*PushDebugGroup)( 750 SDL_GPUCommandBuffer *commandBuffer, 751 const char *name); 752 753 void (*PopDebugGroup)( 754 SDL_GPUCommandBuffer *commandBuffer); 755 756 // Disposal 757 758 void (*ReleaseTexture)( 759 SDL_GPURenderer *driverData, 760 SDL_GPUTexture *texture); 761 762 void (*ReleaseSampler)( 763 SDL_GPURenderer *driverData, 764 SDL_GPUSampler *sampler); 765 766 void (*ReleaseBuffer)( 767 SDL_GPURenderer *driverData, 768 SDL_GPUBuffer *buffer); 769 770 void (*ReleaseTransferBuffer)( 771 SDL_GPURenderer *driverData, 772 SDL_GPUTransferBuffer *transferBuffer); 773 774 void (*ReleaseShader)( 775 SDL_GPURenderer *driverData, 776 SDL_GPUShader *shader); 777 778 void (*ReleaseComputePipeline)( 779 SDL_GPURenderer *driverData, 780 SDL_GPUComputePipeline *computePipeline); 781 782 void (*ReleaseGraphicsPipeline)( 783 SDL_GPURenderer *driverData, 784 SDL_GPUGraphicsPipeline *graphicsPipeline); 785 786 // Render Pass 787 788 void (*BeginRenderPass)( 789 SDL_GPUCommandBuffer *commandBuffer, 790 const SDL_GPUColorTargetInfo *colorTargetInfos, 791 Uint32 numColorTargets, 792 const SDL_GPUDepthStencilTargetInfo *depthStencilTargetInfo); 793 794 void (*BindGraphicsPipeline)( 795 SDL_GPUCommandBuffer *commandBuffer, 796 SDL_GPUGraphicsPipeline *graphicsPipeline); 797 798 void (*SetViewport)( 799 SDL_GPUCommandBuffer *commandBuffer, 800 const SDL_GPUViewport *viewport); 801 802 void (*SetScissor)( 803 SDL_GPUCommandBuffer *commandBuffer, 804 const SDL_Rect *scissor); 805 806 void (*SetBlendConstants)( 807 SDL_GPUCommandBuffer *commandBuffer, 808 SDL_FColor blendConstants); 809 810 void (*SetStencilReference)( 811 SDL_GPUCommandBuffer *commandBuffer, 812 Uint8 reference); 813 814 void (*BindVertexBuffers)( 815 SDL_GPUCommandBuffer *commandBuffer, 816 Uint32 firstSlot, 817 const SDL_GPUBufferBinding *bindings, 818 Uint32 numBindings); 819 820 void (*BindIndexBuffer)( 821 SDL_GPUCommandBuffer *commandBuffer, 822 const SDL_GPUBufferBinding *binding, 823 SDL_GPUIndexElementSize indexElementSize); 824 825 void (*BindVertexSamplers)( 826 SDL_GPUCommandBuffer *commandBuffer, 827 Uint32 firstSlot, 828 const SDL_GPUTextureSamplerBinding *textureSamplerBindings, 829 Uint32 numBindings); 830 831 void (*BindVertexStorageTextures)( 832 SDL_GPUCommandBuffer *commandBuffer, 833 Uint32 firstSlot, 834 SDL_GPUTexture *const *storageTextures, 835 Uint32 numBindings); 836 837 void (*BindVertexStorageBuffers)( 838 SDL_GPUCommandBuffer *commandBuffer, 839 Uint32 firstSlot, 840 SDL_GPUBuffer *const *storageBuffers, 841 Uint32 numBindings); 842 843 void (*BindFragmentSamplers)( 844 SDL_GPUCommandBuffer *commandBuffer, 845 Uint32 firstSlot, 846 const SDL_GPUTextureSamplerBinding *textureSamplerBindings, 847 Uint32 numBindings); 848 849 void (*BindFragmentStorageTextures)( 850 SDL_GPUCommandBuffer *commandBuffer, 851 Uint32 firstSlot, 852 SDL_GPUTexture *const *storageTextures, 853 Uint32 numBindings); 854 855 void (*BindFragmentStorageBuffers)( 856 SDL_GPUCommandBuffer *commandBuffer, 857 Uint32 firstSlot, 858 SDL_GPUBuffer *const *storageBuffers, 859 Uint32 numBindings); 860 861 void (*PushVertexUniformData)( 862 SDL_GPUCommandBuffer *commandBuffer, 863 Uint32 slotIndex, 864 const void *data, 865 Uint32 length); 866 867 void (*PushFragmentUniformData)( 868 SDL_GPUCommandBuffer *commandBuffer, 869 Uint32 slotIndex, 870 const void *data, 871 Uint32 length); 872 873 void (*DrawIndexedPrimitives)( 874 SDL_GPUCommandBuffer *commandBuffer, 875 Uint32 numIndices, 876 Uint32 numInstances, 877 Uint32 firstIndex, 878 Sint32 vertexOffset, 879 Uint32 firstInstance); 880 881 void (*DrawPrimitives)( 882 SDL_GPUCommandBuffer *commandBuffer, 883 Uint32 numVertices, 884 Uint32 numInstances, 885 Uint32 firstVertex, 886 Uint32 firstInstance); 887 888 void (*DrawPrimitivesIndirect)( 889 SDL_GPUCommandBuffer *commandBuffer, 890 SDL_GPUBuffer *buffer, 891 Uint32 offset, 892 Uint32 drawCount); 893 894 void (*DrawIndexedPrimitivesIndirect)( 895 SDL_GPUCommandBuffer *commandBuffer, 896 SDL_GPUBuffer *buffer, 897 Uint32 offset, 898 Uint32 drawCount); 899 900 void (*EndRenderPass)( 901 SDL_GPUCommandBuffer *commandBuffer); 902 903 // Compute Pass 904 905 void (*BeginComputePass)( 906 SDL_GPUCommandBuffer *commandBuffer, 907 const SDL_GPUStorageTextureReadWriteBinding *storageTextureBindings, 908 Uint32 numStorageTextureBindings, 909 const SDL_GPUStorageBufferReadWriteBinding *storageBufferBindings, 910 Uint32 numStorageBufferBindings); 911 912 void (*BindComputePipeline)( 913 SDL_GPUCommandBuffer *commandBuffer, 914 SDL_GPUComputePipeline *computePipeline); 915 916 void (*BindComputeSamplers)( 917 SDL_GPUCommandBuffer *commandBuffer, 918 Uint32 firstSlot, 919 const SDL_GPUTextureSamplerBinding *textureSamplerBindings, 920 Uint32 numBindings); 921 922 void (*BindComputeStorageTextures)( 923 SDL_GPUCommandBuffer *commandBuffer, 924 Uint32 firstSlot, 925 SDL_GPUTexture *const *storageTextures, 926 Uint32 numBindings); 927 928 void (*BindComputeStorageBuffers)( 929 SDL_GPUCommandBuffer *commandBuffer, 930 Uint32 firstSlot, 931 SDL_GPUBuffer *const *storageBuffers, 932 Uint32 numBindings); 933 934 void (*PushComputeUniformData)( 935 SDL_GPUCommandBuffer *commandBuffer, 936 Uint32 slotIndex, 937 const void *data, 938 Uint32 length); 939 940 void (*DispatchCompute)( 941 SDL_GPUCommandBuffer *commandBuffer, 942 Uint32 groupcountX, 943 Uint32 groupcountY, 944 Uint32 groupcountZ); 945 946 void (*DispatchComputeIndirect)( 947 SDL_GPUCommandBuffer *commandBuffer, 948 SDL_GPUBuffer *buffer, 949 Uint32 offset); 950 951 void (*EndComputePass)( 952 SDL_GPUCommandBuffer *commandBuffer); 953 954 // TransferBuffer Data 955 956 void *(*MapTransferBuffer)( 957 SDL_GPURenderer *device, 958 SDL_GPUTransferBuffer *transferBuffer, 959 bool cycle); 960 961 void (*UnmapTransferBuffer)( 962 SDL_GPURenderer *device, 963 SDL_GPUTransferBuffer *transferBuffer); 964 965 // Copy Pass 966 967 void (*BeginCopyPass)( 968 SDL_GPUCommandBuffer *commandBuffer); 969 970 void (*UploadToTexture)( 971 SDL_GPUCommandBuffer *commandBuffer, 972 const SDL_GPUTextureTransferInfo *source, 973 const SDL_GPUTextureRegion *destination, 974 bool cycle); 975 976 void (*UploadToBuffer)( 977 SDL_GPUCommandBuffer *commandBuffer, 978 const SDL_GPUTransferBufferLocation *source, 979 const SDL_GPUBufferRegion *destination, 980 bool cycle); 981 982 void (*CopyTextureToTexture)( 983 SDL_GPUCommandBuffer *commandBuffer, 984 const SDL_GPUTextureLocation *source, 985 const SDL_GPUTextureLocation *destination, 986 Uint32 w, 987 Uint32 h, 988 Uint32 d, 989 bool cycle); 990 991 void (*CopyBufferToBuffer)( 992 SDL_GPUCommandBuffer *commandBuffer, 993 const SDL_GPUBufferLocation *source, 994 const SDL_GPUBufferLocation *destination, 995 Uint32 size, 996 bool cycle); 997 998 void (*GenerateMipmaps)( 999 SDL_GPUCommandBuffer *commandBuffer, 1000 SDL_GPUTexture *texture); 1001 1002 void (*DownloadFromTexture)( 1003 SDL_GPUCommandBuffer *commandBuffer, 1004 const SDL_GPUTextureRegion *source, 1005 const SDL_GPUTextureTransferInfo *destination); 1006 1007 void (*DownloadFromBuffer)( 1008 SDL_GPUCommandBuffer *commandBuffer, 1009 const SDL_GPUBufferRegion *source, 1010 const SDL_GPUTransferBufferLocation *destination); 1011 1012 void (*EndCopyPass)( 1013 SDL_GPUCommandBuffer *commandBuffer); 1014 1015 void (*Blit)( 1016 SDL_GPUCommandBuffer *commandBuffer, 1017 const SDL_GPUBlitInfo *info); 1018 1019 // Submission/Presentation 1020 1021 bool (*SupportsSwapchainComposition)( 1022 SDL_GPURenderer *driverData, 1023 SDL_Window *window, 1024 SDL_GPUSwapchainComposition swapchainComposition); 1025 1026 bool (*SupportsPresentMode)( 1027 SDL_GPURenderer *driverData, 1028 SDL_Window *window, 1029 SDL_GPUPresentMode presentMode); 1030 1031 bool (*ClaimWindow)( 1032 SDL_GPURenderer *driverData, 1033 SDL_Window *window); 1034 1035 void (*ReleaseWindow)( 1036 SDL_GPURenderer *driverData, 1037 SDL_Window *window); 1038 1039 bool (*SetSwapchainParameters)( 1040 SDL_GPURenderer *driverData, 1041 SDL_Window *window, 1042 SDL_GPUSwapchainComposition swapchainComposition, 1043 SDL_GPUPresentMode presentMode); 1044 1045 bool (*SetAllowedFramesInFlight)( 1046 SDL_GPURenderer *driverData, 1047 Uint32 allowedFramesInFlight); 1048 1049 SDL_GPUTextureFormat (*GetSwapchainTextureFormat)( 1050 SDL_GPURenderer *driverData, 1051 SDL_Window *window); 1052 1053 SDL_GPUCommandBuffer *(*AcquireCommandBuffer)( 1054 SDL_GPURenderer *driverData); 1055 1056 bool (*AcquireSwapchainTexture)( 1057 SDL_GPUCommandBuffer *commandBuffer, 1058 SDL_Window *window, 1059 SDL_GPUTexture **swapchainTexture, 1060 Uint32 *swapchainTextureWidth, 1061 Uint32 *swapchainTextureHeight); 1062 1063 bool (*WaitForSwapchain)( 1064 SDL_GPURenderer *driverData, 1065 SDL_Window *window); 1066 1067 bool (*WaitAndAcquireSwapchainTexture)( 1068 SDL_GPUCommandBuffer *commandBuffer, 1069 SDL_Window *window, 1070 SDL_GPUTexture **swapchainTexture, 1071 Uint32 *swapchainTextureWidth, 1072 Uint32 *swapchainTextureHeight); 1073 1074 bool (*Submit)( 1075 SDL_GPUCommandBuffer *commandBuffer); 1076 1077 SDL_GPUFence *(*SubmitAndAcquireFence)( 1078 SDL_GPUCommandBuffer *commandBuffer); 1079 1080 bool (*Cancel)( 1081 SDL_GPUCommandBuffer *commandBuffer); 1082 1083 bool (*Wait)( 1084 SDL_GPURenderer *driverData); 1085 1086 bool (*WaitForFences)( 1087 SDL_GPURenderer *driverData, 1088 bool waitAll, 1089 SDL_GPUFence *const *fences, 1090 Uint32 numFences); 1091 1092 bool (*QueryFence)( 1093 SDL_GPURenderer *driverData, 1094 SDL_GPUFence *fence); 1095 1096 void (*ReleaseFence)( 1097 SDL_GPURenderer *driverData, 1098 SDL_GPUFence *fence); 1099 1100 // Feature Queries 1101 1102 bool (*SupportsTextureFormat)( 1103 SDL_GPURenderer *driverData, 1104 SDL_GPUTextureFormat format, 1105 SDL_GPUTextureType type, 1106 SDL_GPUTextureUsageFlags usage); 1107 1108 bool (*SupportsSampleCount)( 1109 SDL_GPURenderer *driverData, 1110 SDL_GPUTextureFormat format, 1111 SDL_GPUSampleCount desiredSampleCount); 1112 1113 // Opaque pointer for the Driver 1114 SDL_GPURenderer *driverData; 1115 1116 // Store this for SDL_GetGPUDeviceDriver() 1117 const char *backend; 1118 1119 // Store this for SDL_GetGPUShaderFormats() 1120 SDL_GPUShaderFormat shader_formats; 1121 1122 // Store this for SDL_gpu.c's debug layer 1123 bool debug_mode; 1124 bool default_enable_depth_clip; 1125 bool validate_feature_depth_clamp_disabled; 1126 bool validate_feature_anisotropy_disabled; 1127}; 1128 1129#define ASSIGN_DRIVER_FUNC(func, name) \ 1130 result->func = name##_##func; 1131#define ASSIGN_DRIVER(name) \ 1132 ASSIGN_DRIVER_FUNC(DestroyDevice, name) \ 1133 ASSIGN_DRIVER_FUNC(DestroyXRSwapchain, name) \ 1134 ASSIGN_DRIVER_FUNC(GetDeviceProperties, name) \ 1135 ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \ 1136 ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \ 1137 ASSIGN_DRIVER_FUNC(CreateSampler, name) \ 1138 ASSIGN_DRIVER_FUNC(CreateShader, name) \ 1139 ASSIGN_DRIVER_FUNC(CreateTexture, name) \ 1140 ASSIGN_DRIVER_FUNC(CreateBuffer, name) \ 1141 ASSIGN_DRIVER_FUNC(CreateTransferBuffer, name) \ 1142 ASSIGN_DRIVER_FUNC(CreateXRSession, name) \ 1143 ASSIGN_DRIVER_FUNC(GetXRSwapchainFormats, name) \ 1144 ASSIGN_DRIVER_FUNC(CreateXRSwapchain, name) \ 1145 ASSIGN_DRIVER_FUNC(SetBufferName, name) \ 1146 ASSIGN_DRIVER_FUNC(SetTextureName, name) \ 1147 ASSIGN_DRIVER_FUNC(InsertDebugLabel, name) \ 1148 ASSIGN_DRIVER_FUNC(PushDebugGroup, name) \ 1149 ASSIGN_DRIVER_FUNC(PopDebugGroup, name) \ 1150 ASSIGN_DRIVER_FUNC(ReleaseTexture, name) \ 1151 ASSIGN_DRIVER_FUNC(ReleaseSampler, name) \ 1152 ASSIGN_DRIVER_FUNC(ReleaseBuffer, name) \ 1153 ASSIGN_DRIVER_FUNC(ReleaseTransferBuffer, name) \ 1154 ASSIGN_DRIVER_FUNC(ReleaseShader, name) \ 1155 ASSIGN_DRIVER_FUNC(ReleaseComputePipeline, name) \ 1156 ASSIGN_DRIVER_FUNC(ReleaseGraphicsPipeline, name) \ 1157 ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \ 1158 ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \ 1159 ASSIGN_DRIVER_FUNC(SetViewport, name) \ 1160 ASSIGN_DRIVER_FUNC(SetScissor, name) \ 1161 ASSIGN_DRIVER_FUNC(SetBlendConstants, name) \ 1162 ASSIGN_DRIVER_FUNC(SetStencilReference, name) \ 1163 ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \ 1164 ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \ 1165 ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \ 1166 ASSIGN_DRIVER_FUNC(BindVertexStorageTextures, name) \ 1167 ASSIGN_DRIVER_FUNC(BindVertexStorageBuffers, name) \ 1168 ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \ 1169 ASSIGN_DRIVER_FUNC(BindFragmentStorageTextures, name) \ 1170 ASSIGN_DRIVER_FUNC(BindFragmentStorageBuffers, name) \ 1171 ASSIGN_DRIVER_FUNC(PushVertexUniformData, name) \ 1172 ASSIGN_DRIVER_FUNC(PushFragmentUniformData, name) \ 1173 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \ 1174 ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \ 1175 ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \ 1176 ASSIGN_DRIVER_FUNC(DrawIndexedPrimitivesIndirect, name) \ 1177 ASSIGN_DRIVER_FUNC(EndRenderPass, name) \ 1178 ASSIGN_DRIVER_FUNC(BeginComputePass, name) \ 1179 ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ 1180 ASSIGN_DRIVER_FUNC(BindComputeSamplers, name) \ 1181 ASSIGN_DRIVER_FUNC(BindComputeStorageTextures, name) \ 1182 ASSIGN_DRIVER_FUNC(BindComputeStorageBuffers, name) \ 1183 ASSIGN_DRIVER_FUNC(PushComputeUniformData, name) \ 1184 ASSIGN_DRIVER_FUNC(DispatchCompute, name) \ 1185 ASSIGN_DRIVER_FUNC(DispatchComputeIndirect, name) \ 1186 ASSIGN_DRIVER_FUNC(EndComputePass, name) \ 1187 ASSIGN_DRIVER_FUNC(MapTransferBuffer, name) \ 1188 ASSIGN_DRIVER_FUNC(UnmapTransferBuffer, name) \ 1189 ASSIGN_DRIVER_FUNC(BeginCopyPass, name) \ 1190 ASSIGN_DRIVER_FUNC(UploadToTexture, name) \ 1191 ASSIGN_DRIVER_FUNC(UploadToBuffer, name) \ 1192 ASSIGN_DRIVER_FUNC(DownloadFromTexture, name) \ 1193 ASSIGN_DRIVER_FUNC(DownloadFromBuffer, name) \ 1194 ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \ 1195 ASSIGN_DRIVER_FUNC(CopyBufferToBuffer, name) \ 1196 ASSIGN_DRIVER_FUNC(GenerateMipmaps, name) \ 1197 ASSIGN_DRIVER_FUNC(EndCopyPass, name) \ 1198 ASSIGN_DRIVER_FUNC(Blit, name) \ 1199 ASSIGN_DRIVER_FUNC(SupportsSwapchainComposition, name) \ 1200 ASSIGN_DRIVER_FUNC(SupportsPresentMode, name) \ 1201 ASSIGN_DRIVER_FUNC(ClaimWindow, name) \ 1202 ASSIGN_DRIVER_FUNC(ReleaseWindow, name) \ 1203 ASSIGN_DRIVER_FUNC(SetSwapchainParameters, name) \ 1204 ASSIGN_DRIVER_FUNC(SetAllowedFramesInFlight, name) \ 1205 ASSIGN_DRIVER_FUNC(GetSwapchainTextureFormat, name) \ 1206 ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ 1207 ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ 1208 ASSIGN_DRIVER_FUNC(WaitForSwapchain, name) \ 1209 ASSIGN_DRIVER_FUNC(WaitAndAcquireSwapchainTexture, name)\ 1210 ASSIGN_DRIVER_FUNC(Submit, name) \ 1211 ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \ 1212 ASSIGN_DRIVER_FUNC(Cancel, name) \ 1213 ASSIGN_DRIVER_FUNC(Wait, name) \ 1214 ASSIGN_DRIVER_FUNC(WaitForFences, name) \ 1215 ASSIGN_DRIVER_FUNC(QueryFence, name) \ 1216 ASSIGN_DRIVER_FUNC(ReleaseFence, name) \ 1217 ASSIGN_DRIVER_FUNC(SupportsTextureFormat, name) \ 1218 ASSIGN_DRIVER_FUNC(SupportsSampleCount, name) 1219 1220typedef struct SDL_GPUBootstrap 1221{ 1222 const char *name; 1223 bool (*PrepareDriver)(SDL_VideoDevice *_this, SDL_PropertiesID props); 1224 SDL_GPUDevice *(*CreateDevice)(bool debug_mode, bool prefer_low_power, SDL_PropertiesID props); 1225} SDL_GPUBootstrap; 1226 1227#ifdef __cplusplus 1228extern "C" { 1229#endif 1230 1231extern SDL_GPUBootstrap VulkanDriver; 1232extern SDL_GPUBootstrap D3D12Driver; 1233extern SDL_GPUBootstrap MetalDriver; 1234extern SDL_GPUBootstrap PrivateGPUDriver; 1235 1236#ifdef __cplusplus 1237} 1238#endif 1239 1240#endif // SDL_GPU_DRIVER_H 1241
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.