Atlas - SDL_sysgpu.h

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