2024-09-07 08:43:02 -07:00
/*
2024-03-18 11:43:23 -07:00
Simple DirectMedia Layer
2025-01-01 07:45:41 -08:00
Copyright ( C ) 1997 - 2025 Sam Lantinga < slouken @ libsdl . org >
2024-03-18 11:43:23 -07:00
This software is provided ' as - is ' , without any express or implied
warranty . In no event will the authors be held liable for any damages
arising from the use of this software .
Permission is granted to anyone to use this software for any purpose ,
including commercial applications , and to alter it and redistribute it
freely , subject to the following restrictions :
1. The origin of this software must not be misrepresented ; you must not
claim that you wrote the original software . If you use this software
in a product , an acknowledgment in the product documentation would be
appreciated but is not required .
2. Altered source versions must be plainly marked as such , and must not be
misrepresented as being the original software .
3. This notice may not be removed or altered from any source distribution .
*/
2024-08-29 19:45:03 -04:00
/* WIKI CATEGORY: GPU */
2024-03-18 11:43:23 -07:00
/**
2024-08-29 19:45:03 -04:00
* # CategoryGPU
2024-03-18 11:43:23 -07:00
*
2024-10-04 18:22:19 +00:00
* The GPU API offers a cross - platform way for apps to talk to modern graphics
2024-12-11 00:28:23 +00:00
* hardware . It offers both 3 D graphics and compute support , in the style of
2024-10-04 18:22:19 +00:00
* Metal , Vulkan , and Direct3D 12.
2024-10-04 11:21:36 -07:00
*
* A basic workflow might be something like this :
*
2024-10-04 13:04:27 -07:00
* The app creates a GPU device with SDL_CreateGPUDevice ( ) , and assigns it to
2024-10-04 19:29:06 +00:00
* a window with SDL_ClaimWindowForGPUDevice ( ) - - although strictly speaking you
* can render offscreen entirely , perhaps for image processing , and not use a
2024-10-04 18:22:19 +00:00
* window at all .
2024-10-04 11:21:36 -07:00
*
2025-02-28 21:21:47 +00:00
* Next , the app prepares static data ( things that are created once and used
2024-10-04 11:21:36 -07:00
* over and over ) . For example :
*
2024-10-04 12:27:51 -07:00
* - Shaders ( programs that run on the GPU ) : use SDL_CreateGPUShader ( ) .
2025-02-28 21:21:47 +00:00
* - Vertex buffers ( arrays of geometry data ) and other rendering data : use
* SDL_CreateGPUBuffer ( ) and SDL_UploadToGPUBuffer ( ) .
* - Textures ( images ) : use SDL_CreateGPUTexture ( ) and
* SDL_UploadToGPUTexture ( ) .
2024-10-04 12:27:51 -07:00
* - Samplers ( how textures should be read from ) : use SDL_CreateGPUSampler ( ) .
2024-10-04 11:21:36 -07:00
* - Render pipelines ( precalculated rendering state ) : use
2024-10-04 12:27:51 -07:00
* SDL_CreateGPUGraphicsPipeline ( )
2024-10-04 11:21:36 -07:00
*
* To render , the app creates one or more command buffers , with
2024-10-04 19:29:06 +00:00
* SDL_AcquireGPUCommandBuffer ( ) . Command buffers collect rendering
* instructions that will be submitted to the GPU in batch . Complex scenes can
* use multiple command buffers , maybe configured across multiple threads in
* parallel , as long as they are submitted in the correct order , but many apps
* will just need one command buffer per frame .
2024-10-04 11:21:36 -07:00
*
* Rendering can happen to a texture ( what other APIs call a " render target " )
2024-10-04 18:22:19 +00:00
* or it can happen to the swapchain texture ( which is just a special texture
* that represents a window ' s contents ) . The app can use
2024-12-18 18:57:45 +00:00
* SDL_WaitAndAcquireGPUSwapchainTexture ( ) to render to the window .
2024-10-04 11:21:36 -07:00
*
* Rendering actually happens in a Render Pass , which is encoded into a
2024-10-04 18:22:19 +00:00
* command buffer . One can encode multiple render passes ( or alternate between
* render and compute passes ) in a single command buffer , but many apps might
* simply need a single render pass in a single command buffer . Render Passes
* can render to up to four color textures and one depth texture
* simultaneously . If the set of textures being rendered to needs to change ,
* the Render Pass must be ended and a new one must be begun .
2024-10-04 11:21:36 -07:00
*
2024-10-04 19:29:06 +00:00
* The app calls SDL_BeginGPURenderPass ( ) . Then it sets states it needs for
* each draw :
2024-10-04 11:21:36 -07:00
*
2024-10-04 12:27:51 -07:00
* - SDL_BindGPUGraphicsPipeline ( )
* - SDL_SetGPUViewport ( )
* - SDL_BindGPUVertexBuffers ( )
* - SDL_BindGPUVertexSamplers ( )
2024-10-04 11:21:36 -07:00
* - etc
*
* Then , make the actual draw commands with these states :
*
2024-10-04 12:27:51 -07:00
* - SDL_DrawGPUPrimitives ( )
* - SDL_DrawGPUPrimitivesIndirect ( )
* - SDL_DrawGPUIndexedPrimitivesIndirect ( )
2024-10-04 11:21:36 -07:00
* - etc
*
* After all the drawing commands for a pass are complete , the app should call
2024-10-04 12:27:51 -07:00
* SDL_EndGPURenderPass ( ) . Once a render pass ends all render - related state is
2024-10-04 18:22:19 +00:00
* reset .
2024-10-04 11:21:36 -07:00
*
2024-10-04 18:22:19 +00:00
* The app can begin new Render Passes and make new draws in the same command
* buffer until the entire scene is rendered .
2024-10-04 11:21:36 -07:00
*
2024-10-04 18:22:19 +00:00
* Once all of the render commands for the scene are complete , the app calls
2024-10-04 12:27:51 -07:00
* SDL_SubmitGPUCommandBuffer ( ) to send it to the GPU for processing .
2024-10-04 11:21:36 -07:00
*
2024-10-04 18:22:19 +00:00
* If the app needs to read back data from texture or buffers , the API has an
* efficient way of doing this , provided that the app is willing to tolerate
2024-10-04 12:27:51 -07:00
* some latency . When the app uses SDL_DownloadFromGPUTexture ( ) or
* SDL_DownloadFromGPUBuffer ( ) , submitting the command buffer with
2024-11-13 04:49:12 +00:00
* SDL_SubmitGPUCommandBufferAndAcquireFence ( ) will return a fence handle that
* the app can poll or wait on in a thread . Once the fence indicates that the
2024-10-04 18:22:19 +00:00
* command buffer is done processing , it is safe to read the downloaded data .
2024-10-04 12:27:51 -07:00
* Make sure to call SDL_ReleaseGPUFence ( ) when done with the fence .
2024-10-04 11:21:36 -07:00
*
2024-10-04 13:04:27 -07:00
* The API also has " compute " support . The app calls SDL_BeginGPUComputePass ( )
2024-10-04 18:22:19 +00:00
* with compute - writeable textures and / or buffers , which can be written to in
* a compute shader . Then it sets states it needs for the compute dispatches :
2024-10-04 11:21:36 -07:00
*
2024-10-04 12:27:51 -07:00
* - SDL_BindGPUComputePipeline ( )
* - SDL_BindGPUComputeStorageBuffers ( )
* - SDL_BindGPUComputeStorageTextures ( )
2024-10-04 11:21:36 -07:00
*
* Then , dispatch compute work :
*
2024-10-04 12:27:51 -07:00
* - SDL_DispatchGPUCompute ( )
2024-10-04 11:21:36 -07:00
*
* For advanced users , this opens up powerful GPU - driven workflows .
*
2024-10-04 18:22:19 +00:00
* Graphics and compute pipelines require the use of shaders , which as
* mentioned above are small programs executed on the GPU . Each backend
* ( Vulkan , Metal , D3D12 ) requires a different shader format . When the app
* creates the GPU device , the app lets the device know which shader formats
* the app can provide . It will then select the appropriate backend depending
* on the available shader formats and the backends available on the platform .
2024-10-04 18:30:06 +00:00
* When creating shaders , the app must provide the correct shader format for
* the selected backend . If you would like to learn more about why the API
* works this way , there is a detailed
2024-10-04 18:22:19 +00:00
* [ blog post ] ( https : //moonside.games/posts/layers-all-the-way-down/)
2024-10-04 11:21:36 -07:00
* explaining this situation .
*
2024-10-04 18:22:19 +00:00
* It is optimal for apps to pre - compile the shader formats they might use ,
2024-10-15 03:30:54 +00:00
* but for ease of use SDL provides a separate project ,
2024-12-07 04:33:05 +00:00
* [ SDL_shadercross ] ( https : //github.com/libsdl-org/SDL_shadercross)
2025-01-22 17:20:25 +00:00
* , for performing runtime shader cross - compilation . It also has a CLI
* interface for offline precompilation as well .
2024-10-04 11:21:36 -07:00
*
* This is an extremely quick overview that leaves out several important
* details . Already , though , one can see that GPU programming can be quite
* complex ! If you just need simple 2 D graphics , the
2024-10-04 18:22:19 +00:00
* [ Render API ] ( https : //wiki.libsdl.org/SDL3/CategoryRender)
* is much easier to use but still hardware - accelerated . That said , even for
* 2 D applications the performance benefits and expressiveness of the GPU API
* are significant .
*
* The GPU API targets a feature set with a wide range of hardware support and
* ease of portability . It is designed so that the app won ' t have to branch
* itself by querying feature support . If you need cutting - edge features with
* limited hardware support , this API is probably not for you .
*
2024-10-04 18:32:44 +00:00
* Examples demonstrating proper usage of this API can be found
2024-10-04 19:35:00 +00:00
* [ here ] ( https : //github.com/TheSpydog/SDL_gpu_examples)
* .
2024-11-21 19:57:14 -05:00
*
2024-12-31 19:44:29 +00:00
* # # Performance considerations
*
* Here are some basic tips for maximizing your rendering performance .
*
* - Beginning a new render pass is relatively expensive . Use as few render
* passes as you can .
* - Minimize the amount of state changes . For example , binding a pipeline is
* relatively cheap , but doing it hundreds of times when you don ' t need to
* will slow the performance significantly .
* - Perform your data uploads as early as possible in the frame .
* - Don ' t churn resources . Creating and releasing resources is expensive .
* It ' s better to create what you need up front and cache it .
* - Don ' t use uniform buffers for large amounts of data ( more than a matrix
* or so ) . Use a storage buffer instead .
* - Use cycling correctly . There is a detailed explanation of cycling further
* below .
* - Use culling techniques to minimize pixel writes . The less writing the GPU
* has to do the better . Culling can be a very advanced topic but even
* simple culling techniques can boost performance significantly .
*
* In general try to remember the golden rule of performance : doing things is
* more expensive than not doing things . Don ' t Touch The Driver !
*
2024-11-21 19:57:14 -05:00
* # # FAQ
*
2024-11-22 03:38:20 +00:00
* * * Question : When are you adding more advanced features , like ray tracing or
* mesh shaders ? * *
*
* Answer : We don ' t have immediate plans to add more bleeding - edge features ,
* but we certainly might in the future , when these features prove worthwhile ,
* and reasonable to implement across several platforms and underlying APIs .
* So while these things are not in the " never " category , they are definitely
* not " near future " items either .
2024-12-23 22:31:06 -05:00
*
2024-12-26 12:46:42 +11:00
* * * Question : Why is my shader not working ? * *
*
2024-12-26 18:03:51 +00:00
* Answer : A common oversight when using shaders is not properly laying out
* the shader resources / registers correctly . The GPU API is very strict with
* how it wants resources to be laid out and it ' s difficult for the API to
2024-12-26 12:46:42 +11:00
* automatically validate shaders to see if they have a compatible layout . See
* the documentation for SDL_CreateGPUShader ( ) and
* SDL_CreateGPUComputePipeline ( ) for information on the expected layout .
*
2024-12-26 18:03:51 +00:00
* Another common issue is not setting the correct number of samplers ,
* textures , and buffers in SDL_GPUShaderCreateInfo . If possible use shader
* reflection to extract the required information from the shader
* automatically instead of manually filling in the struct ' s values .
2024-12-26 12:46:42 +11:00
*
2024-12-31 19:44:29 +00:00
* * * Question : My application isn ' t performing very well . Is this the GPU
* API ' s fault ? * *
*
* Answer : No . Long answer : The GPU API is a relatively thin layer over the
* underlying graphics API . While it ' s possible that we have done something
* inefficiently , it ' s very unlikely especially if you are relatively
* inexperienced with GPU rendering . Please see the performance tips above and
2025-05-08 14:49:45 +00:00
* make sure you are following them . Additionally , tools like
* [ RenderDoc ] ( https : //renderdoc.org/)
* can be very helpful for diagnosing incorrect behavior and performance
* issues .
2024-12-31 19:44:29 +00:00
*
2024-12-23 22:31:06 -05:00
* # # System Requirements
*
2025-04-22 14:46:54 +00:00
* # # # Vulkan
*
* SDL driver name : " vulkan " ( for use in SDL_CreateGPUDevice ( ) and
* SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING )
*
* Supported on Windows , Linux , Nintendo Switch , and certain Android devices .
* Requires Vulkan 1.0 with the following extensions and device features :
2024-12-26 12:46:42 +11:00
*
* - ` VK_KHR_swapchain `
* - ` VK_KHR_maintenance1 `
* - ` independentBlend `
* - ` imageCubeArray `
* - ` depthClamp `
* - ` shaderClipDistance `
2024-12-23 22:31:06 -05:00
* - ` drawIndirectFirstInstance `
2025-03-19 04:12:43 +03:00
* - ` sampleRateShading `
2024-12-23 22:31:06 -05:00
*
2025-09-29 19:44:11 +00:00
* You can remove some of these requirements to increase compatibility with
* Android devices by using these properties when creating the GPU device with
* SDL_CreateGPUDeviceWithProperties ( ) :
2025-09-29 06:55:36 -07:00
*
* - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN
* - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN
* - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN
* - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN
*
2025-04-22 14:46:54 +00:00
* # # # D3D12
*
* SDL driver name : " direct3d12 "
*
* Supported on Windows 10 or newer , Xbox One ( GDK ) , and Xbox Series X | S
2025-08-22 14:32:28 -04:00
* ( GDK ) . Requires a GPU that supports DirectX 12 Feature Level 11 _0 and
* Resource Binding Tier 2 or above .
2025-04-22 14:46:54 +00:00
*
2025-09-29 19:44:11 +00:00
* You can remove the Tier 2 resource binding requirement to support Intel
* Haswell and Broadwell GPUs by using this property when creating the GPU
* device with SDL_CreateGPUDeviceWithProperties ( ) :
2025-09-29 06:55:36 -07:00
*
* - SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN
*
2025-04-22 14:46:54 +00:00
* # # # Metal
*
* SDL driver name : " metal "
2024-12-23 22:31:06 -05:00
*
2025-04-22 14:46:54 +00:00
* Supported on macOS 10.14 + and iOS / tvOS 13.0 + . Hardware requirements vary by
* operating system :
2024-12-26 12:46:42 +11:00
*
* - macOS requires an Apple Silicon or
* [ Intel Mac2 family ] ( https : //developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc)
* GPU
* - iOS / tvOS requires an A9 GPU or newer
* - iOS Simulator and tvOS Simulator are unsupported
*
2025-04-17 18:06:43 +00:00
* # # Coordinate System
*
* The GPU API uses a left - handed coordinate system , following the convention
2025-04-22 14:33:47 -07:00
* of D3D12 and Metal . Specifically :
*
2025-04-22 21:34:48 +00:00
* - * * Normalized Device Coordinates : * * The lower - left corner has an x , y
* coordinate of ` ( - 1.0 , - 1.0 ) ` . The upper - right corner is ` ( 1.0 , 1.0 ) ` . Z
* values range from ` [ 0.0 , 1.0 ] ` where 0 is the near plane .
* - * * Viewport Coordinates : * * The top - left corner has an x , y coordinate of
* ` ( 0 , 0 ) ` and extends to the bottom - right corner at ` ( viewportWidth ,
* viewportHeight ) ` . + Y is down .
* - * * Texture Coordinates : * * The top - left corner has an x , y coordinate of
* ` ( 0 , 0 ) ` and extends to the bottom - right corner at ` ( 1.0 , 1.0 ) ` . + Y is
* down .
2025-04-17 18:06:43 +00:00
*
* If the backend driver differs from this convention ( e . g . Vulkan , which has
* an NDC that assumes + Y is down ) , SDL will automatically convert the
* coordinate system behind the scenes , so you don ' t need to perform any
* coordinate flipping logic in your shaders .
*
2024-12-26 12:46:42 +11:00
* # # Uniform Data
*
* Uniforms are for passing data to shaders . The uniform data will be constant
* across all executions of the shader .
*
* There are 4 available uniform slots per shader stage ( where the stages are
* vertex , fragment , and compute ) . Uniform data pushed to a slot on a stage
* keeps its value throughout the command buffer until you call the relevant
* Push function on that slot again .
*
2024-12-26 18:03:51 +00:00
* For example , you could write your vertex shaders to read a camera matrix
* from uniform binding slot 0 , push the camera matrix at the start of the
* command buffer , and that data will be used for every subsequent draw call .
2024-12-26 12:46:42 +11:00
*
* It is valid to push uniform data during a render or compute pass .
*
2024-12-26 18:03:51 +00:00
* Uniforms are best for pushing small amounts of data . If you are pushing
* more than a matrix or two per call you should consider using a storage
* buffer instead .
2024-12-26 12:46:42 +11:00
*
* # # A Note On Cycling
*
2024-12-26 18:03:51 +00:00
* When using a command buffer , operations do not occur immediately - they
* occur some time after the command buffer is submitted .
2024-12-26 12:46:42 +11:00
*
* When a resource is used in a pending or active command buffer , it is
2024-12-26 18:03:51 +00:00
* considered to be " bound " . When a resource is no longer used in any pending
* or active command buffers , it is considered to be " unbound " .
2024-12-26 12:46:42 +11:00
*
2024-12-26 18:03:51 +00:00
* If data resources are bound , it is unspecified when that data will be
* unbound unless you acquire a fence when submitting the command buffer and
* wait on it . However , this doesn ' t mean you need to track resource usage
* manually .
2024-12-26 12:46:42 +11:00
*
* All of the functions and structs that involve writing to a resource have a
* " cycle " bool . SDL_GPUTransferBuffer , SDL_GPUBuffer , and SDL_GPUTexture all
* effectively function as ring buffers on internal resources . When cycle is
* true , if the resource is bound , the cycle rotates to the next unbound
2024-12-26 18:03:51 +00:00
* internal resource , or if none are available , a new one is created . This
* means you don ' t have to worry about complex state tracking and
* synchronization as long as cycling is correctly employed .
2024-12-26 12:46:42 +11:00
*
* For example : you can call SDL_MapGPUTransferBuffer ( ) , write texture data ,
* SDL_UnmapGPUTransferBuffer ( ) , and then SDL_UploadToGPUTexture ( ) . The next
* time you write texture data to the transfer buffer , if you set the cycle
2024-12-26 18:03:51 +00:00
* param to true , you don ' t have to worry about overwriting any data that is
* not yet uploaded .
2024-12-26 12:46:42 +11:00
*
* Another example : If you are using a texture in a render pass every frame ,
2024-12-26 18:03:51 +00:00
* this can cause a data dependency between frames . If you set cycle to true
* in the SDL_GPUColorTargetInfo struct , you can prevent this data dependency .
2024-12-26 12:46:42 +11:00
*
2024-12-26 18:03:51 +00:00
* Cycling will never undefine already bound data . When cycling , all data in
* the resource is considered to be undefined for subsequent commands until
* that data is written again . You must take care not to read undefined data .
2024-12-26 12:46:42 +11:00
*
2024-12-26 18:03:51 +00:00
* Note that when cycling a texture , the entire texture will be cycled , even
* if only part of the texture is used in the call , so you must consider the
* entire texture to contain undefined data after cycling .
2024-12-26 12:46:42 +11:00
*
* You must also take care not to overwrite a section of data that has been
* referenced in a command without cycling first . It is OK to overwrite
* unreferenced data in a bound resource without cycling , but overwriting a
* section of data that has already been referenced will produce unexpected
* results .
2025-05-08 14:49:45 +00:00
*
* # # Debugging
*
* At some point of your GPU journey , you will probably encounter issues that
* are not traceable with regular debugger - for example , your code compiles
* but you get an empty screen , or your shader fails in runtime .
*
* For debugging such cases , there are tools that allow visually inspecting
* the whole GPU frame , every drawcall , every bound resource , memory buffers ,
* etc . They are the following , per platform :
*
* * For Windows / Linux , use
* [ RenderDoc ] ( https : //renderdoc.org/)
* * For MacOS ( Metal ) , use Xcode built - in debugger ( Open XCode , go to Debug >
* Debug Executable . . . , select your application , set " GPU Frame Capture " to
* " Metal " in scheme " Options " window , run your app , and click the small
* Metal icon on the bottom to capture a frame )
*
* Aside from that , you may want to enable additional debug layers to receive
* more detailed error messages , based on your GPU backend :
*
* * For D3D12 , the debug layer is an optional feature that can be installed
* via " Windows Settings -> System -> Optional features " and adding the
* " Graphics Tools " optional feature .
* * For Vulkan , you will need to install Vulkan SDK on Windows , and on Linux ,
* you usually have some sort of ` vulkan - validation - layers ` system package
* that should be installed .
* * For Metal , it should be enough just to run the application from XCode to
* receive detailed errors or warnings in the output .
*
* Don ' t hesitate to use tools as RenderDoc when encountering runtime issues
* or unexpected output on screen , quick GPU frame inspection can usually help
* you fix the majority of such problems .
2024-03-18 11:43:23 -07:00
*/
2024-08-31 10:02:46 -07:00
# ifndef SDL_gpu_h_
# define SDL_gpu_h_
2024-03-18 11:43:23 -07:00
# include <SDL3/SDL_stdinc.h>
2024-08-31 18:36:54 +02:00
# include <SDL3/SDL_pixels.h>
2024-08-31 10:00:11 -07:00
# include <SDL3/SDL_properties.h>
2024-08-31 18:36:54 +02:00
# include <SDL3/SDL_rect.h>
# include <SDL3/SDL_surface.h>
# include <SDL3/SDL_video.h>
2024-03-18 11:43:23 -07:00
2024-08-31 10:02:46 -07:00
# include <SDL3/SDL_begin_code.h>
2024-03-18 11:43:23 -07:00
# ifdef __cplusplus
extern " C " {
# endif /* __cplusplus */
/* Type Declarations */
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing the SDL_GPU context .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUDevice SDL_GPUDevice ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a buffer .
*
2024-09-05 01:25:36 +00:00
* Used for vertices , indices , indirect draw commands , and general compute
* data .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUBuffer
* \ sa SDL_UploadToGPUBuffer
* \ sa SDL_DownloadFromGPUBuffer
* \ sa SDL_CopyGPUBufferToBuffer
* \ sa SDL_BindGPUVertexBuffers
* \ sa SDL_BindGPUIndexBuffer
* \ sa SDL_BindGPUVertexStorageBuffers
* \ sa SDL_BindGPUFragmentStorageBuffers
* \ sa SDL_DrawGPUPrimitivesIndirect
* \ sa SDL_DrawGPUIndexedPrimitivesIndirect
* \ sa SDL_BindGPUComputeStorageBuffers
* \ sa SDL_DispatchGPUComputeIndirect
* \ sa SDL_ReleaseGPUBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBuffer SDL_GPUBuffer ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a transfer buffer .
*
* Used for transferring data to and from the device .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTransferBuffer
* \ sa SDL_MapGPUTransferBuffer
* \ sa SDL_UnmapGPUTransferBuffer
* \ sa SDL_UploadToGPUBuffer
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUBuffer
* \ sa SDL_DownloadFromGPUTexture
* \ sa SDL_ReleaseGPUTransferBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTransferBuffer SDL_GPUTransferBuffer ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a texture .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTexture
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUTexture
* \ sa SDL_CopyGPUTextureToTexture
* \ sa SDL_BindGPUVertexSamplers
* \ sa SDL_BindGPUVertexStorageTextures
* \ sa SDL_BindGPUFragmentSamplers
* \ sa SDL_BindGPUFragmentStorageTextures
* \ sa SDL_BindGPUComputeStorageTextures
* \ sa SDL_GenerateMipmapsForGPUTexture
* \ sa SDL_BlitGPUTexture
* \ sa SDL_ReleaseGPUTexture
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTexture SDL_GPUTexture ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a sampler .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUSampler
* \ sa SDL_BindGPUVertexSamplers
* \ sa SDL_BindGPUFragmentSamplers
* \ sa SDL_ReleaseGPUSampler
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUSampler SDL_GPUSampler ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a compiled shader object .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUShader
* \ sa SDL_CreateGPUGraphicsPipeline
* \ sa SDL_ReleaseGPUShader
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUShader SDL_GPUShader ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a compute pipeline .
*
* Used during compute passes .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUComputePipeline
* \ sa SDL_BindGPUComputePipeline
* \ sa SDL_ReleaseGPUComputePipeline
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUComputePipeline SDL_GPUComputePipeline ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a graphics pipeline .
*
* Used during render passes .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
* \ sa SDL_BindGPUGraphicsPipeline
* \ sa SDL_ReleaseGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUGraphicsPipeline SDL_GPUGraphicsPipeline ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a command buffer .
*
2024-09-05 01:25:36 +00:00
* Most state is managed via command buffers . When setting state using a
* command buffer , that state is local to the command buffer .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* Commands only begin execution on the GPU once SDL_SubmitGPUCommandBuffer is
* called . Once the command buffer is submitted , it is no longer valid to use
* it .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* Command buffers are executed in submission order . If you submit command
* buffer A and then command buffer B all commands in A will begin executing
* before any command in B begins executing .
2024-09-04 18:24:11 -07:00
*
2024-10-10 17:02:43 +00:00
* In multi - threading scenarios , you should only access a command buffer on
* the thread you acquired it from .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_AcquireGPUCommandBuffer
* \ sa SDL_SubmitGPUCommandBuffer
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUCommandBuffer SDL_GPUCommandBuffer ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a render pass .
*
2024-09-05 01:25:36 +00:00
* This handle is transient and should not be held or referenced after
* SDL_EndGPURenderPass is called .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_BeginGPURenderPass
* \ sa SDL_EndGPURenderPass
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPURenderPass SDL_GPURenderPass ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a compute pass .
*
2024-09-05 01:25:36 +00:00
* This handle is transient and should not be held or referenced after
* SDL_EndGPUComputePass is called .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_BeginGPUComputePass
* \ sa SDL_EndGPUComputePass
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUComputePass SDL_GPUComputePass ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a copy pass .
*
2024-09-05 01:25:36 +00:00
* This handle is transient and should not be held or referenced after
* SDL_EndGPUCopyPass is called .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_BeginGPUCopyPass
* \ sa SDL_EndGPUCopyPass
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUCopyPass SDL_GPUCopyPass ;
2024-09-04 18:24:11 -07:00
/**
* An opaque handle representing a fence .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
* \ sa SDL_QueryGPUFence
* \ sa SDL_WaitForGPUFences
* \ sa SDL_ReleaseGPUFence
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUFence SDL_GPUFence ;
2024-09-04 18:24:11 -07:00
/**
* Specifies the primitive topology of a graphics pipeline .
*
2025-01-17 22:26:32 +00:00
* If you are using POINTLIST you must include a point size output in the
2025-01-17 23:11:30 +00:00
* vertex shader .
*
* - For HLSL compiling to SPIRV you must decorate a float output with
* [ [ vk : : builtin ( " PointSize " ) ] ] .
* - For GLSL you must set the gl_PointSize builtin .
* - For MSL you must include a float output with the [ [ point_size ] ]
* decorator .
*
* Note that sized point topology is totally unsupported on D3D12 . Any size
* other than 1 will be ignored . In general , you should avoid using point
* topology for both compatibility and performance reasons . You WILL regret
* using it .
2025-01-17 14:25:14 -08:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUPrimitiveType
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_PRIMITIVETYPE_TRIANGLELIST , /**< A series of separate triangles. */
SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP , /**< A series of connected triangles. */
2024-09-04 18:24:11 -07:00
SDL_GPU_PRIMITIVETYPE_LINELIST , /**< A series of separate lines. */
SDL_GPU_PRIMITIVETYPE_LINESTRIP , /**< A series of connected lines. */
2024-09-10 18:17:08 -07:00
SDL_GPU_PRIMITIVETYPE_POINTLIST /**< A series of separate points. */
2024-08-29 16:08:10 -07:00
} SDL_GPUPrimitiveType ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies how the contents of a texture attached to a render pass are
* treated at the beginning of the render pass .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_BeginGPURenderPass
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPULoadOp
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_LOADOP_LOAD , /**< The previous contents of the texture will be preserved. */
SDL_GPU_LOADOP_CLEAR , /**< The contents of the texture will be cleared to a color. */
SDL_GPU_LOADOP_DONT_CARE /**< The previous contents of the texture need not be preserved. The contents will be undefined. */
2024-08-29 16:08:10 -07:00
} SDL_GPULoadOp ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies how the contents of a texture attached to a render pass are
* treated at the end of the render pass .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_BeginGPURenderPass
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUStoreOp
2024-03-18 11:43:23 -07:00
{
2024-09-16 12:19:09 -05:00
SDL_GPU_STOREOP_STORE , /**< The contents generated during the render pass will be written to memory. */
SDL_GPU_STOREOP_DONT_CARE , /**< The contents generated during the render pass are not needed and may be discarded. The contents will be undefined. */
SDL_GPU_STOREOP_RESOLVE , /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture may then be discarded and will be undefined. */
SDL_GPU_STOREOP_RESOLVE_AND_STORE /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture will be written to memory. */
2024-08-29 16:08:10 -07:00
} SDL_GPUStoreOp ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the size of elements in an index buffer .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUIndexElementSize
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_INDEXELEMENTSIZE_16BIT , /**< The index elements are 16-bit. */
SDL_GPU_INDEXELEMENTSIZE_32BIT /**< The index elements are 32-bit. */
2024-08-29 16:08:10 -07:00
} SDL_GPUIndexElementSize ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the pixel format of a texture .
*
2024-09-05 01:25:36 +00:00
* Texture format support varies depending on driver , hardware , and usage
* flags . In general , you should use SDL_GPUTextureSupportsFormat to query if
* a format is supported before using it . However , there are a few guaranteed
* formats .
*
2024-09-27 20:27:48 +00:00
* FIXME : Check universal support for 32 - bit component formats FIXME : Check
* universal support for SIMULTANEOUS_READ_WRITE
2024-09-27 12:52:22 -07:00
*
2024-09-05 09:57:26 -07:00
* For SAMPLER usage , the following formats are universally supported :
*
* - R8G8B8A8_UNORM
* - B8G8R8A8_UNORM
* - R8_UNORM
* - R8_SNORM
* - R8G8_UNORM
* - R8G8_SNORM
* - R8G8B8A8_SNORM
* - R16_FLOAT
* - R16G16_FLOAT
* - R16G16B16A16_FLOAT
* - R32_FLOAT
* - R32G32_FLOAT
* - R32G32B32A32_FLOAT
* - R11G11B10_UFLOAT
* - R8G8B8A8_UNORM_SRGB
* - B8G8R8A8_UNORM_SRGB
* - D16_UNORM
*
* For COLOR_TARGET usage , the following formats are universally supported :
*
* - R8G8B8A8_UNORM
* - B8G8R8A8_UNORM
* - R8_UNORM
* - R16_FLOAT
* - R16G16_FLOAT
* - R16G16B16A16_FLOAT
* - R32_FLOAT
* - R32G32_FLOAT
* - R32G32B32A32_FLOAT
* - R8_UINT
* - R8G8_UINT
* - R8G8B8A8_UINT
* - R16_UINT
* - R16G16_UINT
* - R16G16B16A16_UINT
* - R8_INT
* - R8G8_INT
* - R8G8B8A8_INT
* - R16_INT
* - R16G16_INT
* - R16G16B16A16_INT
* - R8G8B8A8_UNORM_SRGB
* - B8G8R8A8_UNORM_SRGB
*
* For STORAGE usages , the following formats are universally supported :
*
* - R8G8B8A8_UNORM
* - R8G8B8A8_SNORM
* - R16G16B16A16_FLOAT
* - R32_FLOAT
* - R32G32_FLOAT
* - R32G32B32A32_FLOAT
* - R8G8B8A8_UINT
* - R16G16B16A16_UINT
* - R8G8B8A8_INT
* - R16G16B16A16_INT
2024-09-05 01:25:36 +00:00
*
* For DEPTH_STENCIL_TARGET usage , the following formats are universally
2024-09-05 09:57:26 -07:00
* supported :
*
* - D16_UNORM
2025-01-21 13:13:52 +10:00
* - Either ( but not necessarily both ! ) D24_UNORM or D32_FLOAT
2025-01-21 04:01:28 +00:00
* - Either ( but not necessarily both ! ) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT
2024-09-05 01:25:36 +00:00
*
* Unless D16_UNORM is sufficient for your purposes , always check which of
* D24 / D32 is supported before creating a depth - stencil texture !
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTexture
* \ sa SDL_GPUTextureSupportsFormat
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUTextureFormat
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_TEXTUREFORMAT_INVALID ,
2024-03-18 11:43:23 -07:00
/* Unsigned Normalized Float Color Formats */
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_A8_UNORM ,
SDL_GPU_TEXTUREFORMAT_R8_UNORM ,
SDL_GPU_TEXTUREFORMAT_R8G8_UNORM ,
2024-03-18 11:43:23 -07:00
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM ,
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_R16_UNORM ,
SDL_GPU_TEXTUREFORMAT_R16G16_UNORM ,
SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM ,
SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM ,
2024-03-18 11:43:23 -07:00
SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM ,
SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM ,
SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM ,
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM ,
2024-03-18 11:43:23 -07:00
/* Compressed Unsigned Normalized Float Color Formats */
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM ,
SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM ,
SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM ,
SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM ,
SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM ,
SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM ,
/* Compressed Signed Float Color Formats */
SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT ,
/* Compressed Unsigned Float Color Formats */
SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT ,
2024-03-18 11:43:23 -07:00
/* Signed Normalized Float Color Formats */
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_R8_SNORM ,
2024-03-18 11:43:23 -07:00
SDL_GPU_TEXTUREFORMAT_R8G8_SNORM ,
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM ,
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_R16_SNORM ,
SDL_GPU_TEXTUREFORMAT_R16G16_SNORM ,
SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM ,
2024-03-18 11:43:23 -07:00
/* Signed Float Color Formats */
SDL_GPU_TEXTUREFORMAT_R16_FLOAT ,
SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT ,
SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT ,
SDL_GPU_TEXTUREFORMAT_R32_FLOAT ,
SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT ,
SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT ,
2024-09-03 03:14:48 +03:00
/* Unsigned Float Color Formats */
SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT ,
2024-03-18 11:43:23 -07:00
/* Unsigned Integer Color Formats */
SDL_GPU_TEXTUREFORMAT_R8_UINT ,
SDL_GPU_TEXTUREFORMAT_R8G8_UINT ,
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT ,
SDL_GPU_TEXTUREFORMAT_R16_UINT ,
SDL_GPU_TEXTUREFORMAT_R16G16_UINT ,
SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT ,
2024-09-27 12:52:22 -07:00
SDL_GPU_TEXTUREFORMAT_R32_UINT ,
SDL_GPU_TEXTUREFORMAT_R32G32_UINT ,
SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT ,
2024-09-03 03:14:48 +03:00
/* Signed Integer Color Formats */
SDL_GPU_TEXTUREFORMAT_R8_INT ,
SDL_GPU_TEXTUREFORMAT_R8G8_INT ,
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT ,
SDL_GPU_TEXTUREFORMAT_R16_INT ,
SDL_GPU_TEXTUREFORMAT_R16G16_INT ,
SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT ,
2024-09-27 12:52:22 -07:00
SDL_GPU_TEXTUREFORMAT_R32_INT ,
SDL_GPU_TEXTUREFORMAT_R32G32_INT ,
SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT ,
2024-03-18 11:43:23 -07:00
/* SRGB Unsigned Normalized Color Formats */
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB ,
/* Compressed SRGB Unsigned Normalized Color Formats */
2024-09-03 03:14:48 +03:00
SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB ,
2024-03-18 11:43:23 -07:00
/* Depth Formats */
SDL_GPU_TEXTUREFORMAT_D16_UNORM ,
SDL_GPU_TEXTUREFORMAT_D24_UNORM ,
SDL_GPU_TEXTUREFORMAT_D32_FLOAT ,
SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT ,
2024-10-09 00:45:04 +02:00
SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT ,
/* Compressed ASTC Normalized Float Color Formats*/
SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM ,
/* Compressed SRGB ASTC Normalized Float Color Formats*/
SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB ,
/* Compressed ASTC Signed Float Color Formats*/
SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT ,
SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureFormat ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies how a texture is intended to be used by the client .
*
2024-09-05 01:25:36 +00:00
* A texture must have at least one usage flag . Note that some usage flag
* combinations are invalid .
2024-09-04 18:24:11 -07:00
*
2024-09-27 19:50:13 +00:00
* With regards to compute storage usage , READ | WRITE means that you can have
* shader A that only writes into the texture and shader B that only reads
* from the texture and bind the same texture to either shader respectively .
* SIMULTANEOUS means that you can do reads and writes within the same shader
* or compute pass . It also implies that atomic ops can be used , since those
* are read - modify - write operations . If you use SIMULTANEOUS , you are
* responsible for avoiding data races , as there is no data synchronization
* within a compute pass . Note that SIMULTANEOUS usage is only supported by a
* limited number of texture formats .
2024-09-27 12:49:37 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This datatype is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTexture
*/
2024-08-29 16:08:10 -07:00
typedef Uint32 SDL_GPUTextureUsageFlags ;
2024-03-18 11:43:23 -07:00
2024-09-27 12:49:37 -07:00
# define SDL_GPU_TEXTUREUSAGE_SAMPLER (1u << 0) /**< Texture supports sampling. */
# define SDL_GPU_TEXTUREUSAGE_COLOR_TARGET (1u << 1) /**< Texture is a color render target. */
# define SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET (1u << 2) /**< Texture is a depth stencil target. */
# define SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Texture supports storage reads in graphics stages. */
# define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Texture supports storage reads in the compute stage. */
# define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Texture supports storage writes in the compute stage. */
# define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE (1u << 6) /**< Texture supports reads and writes in the same compute shader. This is NOT equivalent to READ | WRITE. */
2024-09-02 17:19:43 -05:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the type of a texture .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTexture
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUTextureType
2024-03-18 11:43:23 -07:00
{
2024-09-12 13:41:46 -07:00
SDL_GPU_TEXTURETYPE_2D , /**< The texture is a 2-dimensional image. */
SDL_GPU_TEXTURETYPE_2D_ARRAY , /**< The texture is a 2-dimensional array image. */
SDL_GPU_TEXTURETYPE_3D , /**< The texture is a 3-dimensional image. */
SDL_GPU_TEXTURETYPE_CUBE , /**< The texture is a cube image. */
2024-09-21 17:17:06 +02:00
SDL_GPU_TEXTURETYPE_CUBE_ARRAY /**< The texture is a cube array image. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureType ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the sample count of a texture .
*
2024-09-05 01:25:36 +00:00
* Used in multisampling . Note that this value only applies when the texture
2024-09-06 18:38:23 -05:00
* is used as a render target .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTexture
* \ sa SDL_GPUTextureSupportsSampleCount
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUSampleCount
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_SAMPLECOUNT_1 , /**< No multisampling. */
SDL_GPU_SAMPLECOUNT_2 , /**< MSAA 2x */
SDL_GPU_SAMPLECOUNT_4 , /**< MSAA 4x */
SDL_GPU_SAMPLECOUNT_8 /**< MSAA 8x */
2024-08-29 16:08:10 -07:00
} SDL_GPUSampleCount ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the face of a cube map .
*
* Can be passed in as the layer field in texture - related structs .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUCubeMapFace
2024-03-18 11:43:23 -07:00
{
SDL_GPU_CUBEMAPFACE_POSITIVEX ,
SDL_GPU_CUBEMAPFACE_NEGATIVEX ,
SDL_GPU_CUBEMAPFACE_POSITIVEY ,
SDL_GPU_CUBEMAPFACE_NEGATIVEY ,
SDL_GPU_CUBEMAPFACE_POSITIVEZ ,
SDL_GPU_CUBEMAPFACE_NEGATIVEZ
2024-08-29 16:08:10 -07:00
} SDL_GPUCubeMapFace ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies how a buffer is intended to be used by the client .
*
2024-09-05 01:25:36 +00:00
* A buffer must have at least one usage flag . Note that some usage flag
* combinations are invalid .
2024-09-04 18:24:11 -07:00
*
2024-09-27 19:50:13 +00:00
* Unlike textures , READ | WRITE can be used for simultaneous read - write
* usage . The same data synchronization concerns as textures apply .
2024-09-27 12:49:37 -07:00
*
2025-01-21 23:00:08 +00:00
* If you use a STORAGE flag , the data in the buffer must respect std140
* layout conventions . In practical terms this means you must ensure that vec3
* and vec4 fields are 16 - byte aligned .
*
2025-01-21 10:19:21 -08:00
* \ since This datatype is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUBuffer
*/
2024-08-29 16:08:10 -07:00
typedef Uint32 SDL_GPUBufferUsageFlags ;
2024-03-18 11:43:23 -07:00
2024-09-27 12:49:37 -07:00
# define SDL_GPU_BUFFERUSAGE_VERTEX (1u << 0) /**< Buffer is a vertex buffer. */
# define SDL_GPU_BUFFERUSAGE_INDEX (1u << 1) /**< Buffer is an index buffer. */
# define SDL_GPU_BUFFERUSAGE_INDIRECT (1u << 2) /**< Buffer is an indirect buffer. */
# define SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Buffer supports storage reads in graphics stages. */
# define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Buffer supports storage reads in the compute stage. */
# define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Buffer supports storage writes in the compute stage. */
2024-09-02 17:19:43 -05:00
2024-09-04 18:24:11 -07:00
/**
* Specifies how a transfer buffer is intended to be used by the client .
*
2024-09-05 01:25:36 +00:00
* Note that mapping and copying FROM an upload transfer buffer or TO a
* download transfer buffer is undefined behavior .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUTransferBuffer
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUTransferBufferUsage
2024-03-18 11:43:23 -07:00
{
SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD ,
SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD
2024-08-29 16:08:10 -07:00
} SDL_GPUTransferBufferUsage ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies which stage a shader program corresponds to .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUShader
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUShaderStage
2024-03-18 11:43:23 -07:00
{
SDL_GPU_SHADERSTAGE_VERTEX ,
SDL_GPU_SHADERSTAGE_FRAGMENT
2024-08-29 16:08:10 -07:00
} SDL_GPUShaderStage ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the format of shader code .
*
* Each format corresponds to a specific backend that accepts it .
*
2025-01-21 10:19:21 -08:00
* \ since This datatype is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUShader
*/
2024-08-29 16:08:10 -07:00
typedef Uint32 SDL_GPUShaderFormat ;
2024-03-18 11:43:23 -07:00
2024-09-10 18:17:08 -07:00
# define SDL_GPU_SHADERFORMAT_INVALID 0
2024-09-11 15:39:06 -07:00
# define SDL_GPU_SHADERFORMAT_PRIVATE (1u << 0) /**< Shaders for NDA'd platforms. */
# define SDL_GPU_SHADERFORMAT_SPIRV (1u << 1) /**< SPIR-V shaders for Vulkan. */
2024-11-12 10:55:21 -08:00
# define SDL_GPU_SHADERFORMAT_DXBC (1u << 2) /**< DXBC SM5_1 shaders for D3D12. */
# define SDL_GPU_SHADERFORMAT_DXIL (1u << 3) /**< DXIL SM6_0 shaders for D3D12. */
2024-09-11 15:39:06 -07:00
# define SDL_GPU_SHADERFORMAT_MSL (1u << 4) /**< MSL shaders for Metal. */
# define SDL_GPU_SHADERFORMAT_METALLIB (1u << 5) /**< Precompiled metallib shaders for Metal. */
2024-09-02 17:19:43 -05:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the format of a vertex attribute .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUVertexElementFormat
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_VERTEXELEMENTFORMAT_INVALID ,
2024-03-18 11:43:23 -07:00
/* 32-bit Signed Integers */
SDL_GPU_VERTEXELEMENTFORMAT_INT ,
SDL_GPU_VERTEXELEMENTFORMAT_INT2 ,
SDL_GPU_VERTEXELEMENTFORMAT_INT3 ,
SDL_GPU_VERTEXELEMENTFORMAT_INT4 ,
/* 32-bit Unsigned Integers */
SDL_GPU_VERTEXELEMENTFORMAT_UINT ,
SDL_GPU_VERTEXELEMENTFORMAT_UINT2 ,
SDL_GPU_VERTEXELEMENTFORMAT_UINT3 ,
SDL_GPU_VERTEXELEMENTFORMAT_UINT4 ,
/* 32-bit Floats */
SDL_GPU_VERTEXELEMENTFORMAT_FLOAT ,
SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2 ,
SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3 ,
SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4 ,
/* 8-bit Signed Integers */
SDL_GPU_VERTEXELEMENTFORMAT_BYTE2 ,
SDL_GPU_VERTEXELEMENTFORMAT_BYTE4 ,
/* 8-bit Unsigned Integers */
SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2 ,
SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4 ,
/* 8-bit Signed Normalized */
SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM ,
SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM ,
/* 8-bit Unsigned Normalized */
SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM ,
SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM ,
/* 16-bit Signed Integers */
SDL_GPU_VERTEXELEMENTFORMAT_SHORT2 ,
SDL_GPU_VERTEXELEMENTFORMAT_SHORT4 ,
/* 16-bit Unsigned Integers */
SDL_GPU_VERTEXELEMENTFORMAT_USHORT2 ,
SDL_GPU_VERTEXELEMENTFORMAT_USHORT4 ,
/* 16-bit Signed Normalized */
SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM ,
SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM ,
/* 16-bit Unsigned Normalized */
SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM ,
SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM ,
/* 16-bit Floats */
SDL_GPU_VERTEXELEMENTFORMAT_HALF2 ,
SDL_GPU_VERTEXELEMENTFORMAT_HALF4
2024-08-29 16:08:10 -07:00
} SDL_GPUVertexElementFormat ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the rate at which vertex attributes are pulled from buffers .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUVertexInputRate
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_VERTEXINPUTRATE_VERTEX , /**< Attribute addressing is a function of the vertex index. */
SDL_GPU_VERTEXINPUTRATE_INSTANCE /**< Attribute addressing is a function of the instance index. */
2024-08-29 16:08:10 -07:00
} SDL_GPUVertexInputRate ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the fill mode of the graphics pipeline .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUFillMode
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_FILLMODE_FILL , /**< Polygons will be rendered via rasterization. */
SDL_GPU_FILLMODE_LINE /**< Polygon edges will be drawn as line segments. */
2024-08-29 16:08:10 -07:00
} SDL_GPUFillMode ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the facing direction in which triangle faces will be culled .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUCullMode
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_CULLMODE_NONE , /**< No triangles are culled. */
SDL_GPU_CULLMODE_FRONT , /**< Front-facing triangles are culled. */
SDL_GPU_CULLMODE_BACK /**< Back-facing triangles are culled. */
2024-08-29 16:08:10 -07:00
} SDL_GPUCullMode ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies the vertex winding that will cause a triangle to be determined to
* be front - facing .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUFrontFace
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE , /**< A triangle with counter-clockwise vertex winding will be considered front-facing. */
2024-09-05 09:57:26 -07:00
SDL_GPU_FRONTFACE_CLOCKWISE /**< A triangle with clockwise vertex winding will be considered front-facing. */
2024-08-29 16:08:10 -07:00
} SDL_GPUFrontFace ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies a comparison operator for depth , stencil and sampler operations .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUCompareOp
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_COMPAREOP_INVALID ,
2024-09-04 18:24:11 -07:00
SDL_GPU_COMPAREOP_NEVER , /**< The comparison always evaluates false. */
SDL_GPU_COMPAREOP_LESS , /**< The comparison evaluates reference < test. */
SDL_GPU_COMPAREOP_EQUAL , /**< The comparison evaluates reference == test. */
SDL_GPU_COMPAREOP_LESS_OR_EQUAL , /**< The comparison evaluates reference <= test. */
SDL_GPU_COMPAREOP_GREATER , /**< The comparison evaluates reference > test. */
SDL_GPU_COMPAREOP_NOT_EQUAL , /**< The comparison evaluates reference != test. */
2025-08-07 11:58:25 +01:00
SDL_GPU_COMPAREOP_GREATER_OR_EQUAL , /**< The comparison evaluates reference >= test. */
2024-09-04 18:24:11 -07:00
SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */
2024-08-29 16:08:10 -07:00
} SDL_GPUCompareOp ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies what happens to a stored stencil value if stencil tests fail or
* pass .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUStencilOp
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_STENCILOP_INVALID ,
2024-09-04 18:24:11 -07:00
SDL_GPU_STENCILOP_KEEP , /**< Keeps the current value. */
SDL_GPU_STENCILOP_ZERO , /**< Sets the value to 0. */
SDL_GPU_STENCILOP_REPLACE , /**< Sets the value to reference. */
SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP , /**< Increments the current value and clamps to the maximum value. */
SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP , /**< Decrements the current value and clamps to 0. */
SDL_GPU_STENCILOP_INVERT , /**< Bitwise-inverts the current value. */
SDL_GPU_STENCILOP_INCREMENT_AND_WRAP , /**< Increments the current value and wraps back to 0. */
SDL_GPU_STENCILOP_DECREMENT_AND_WRAP /**< Decrements the current value and wraps to the maximum value. */
2024-08-29 16:08:10 -07:00
} SDL_GPUStencilOp ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-06 23:39:48 +00:00
* Specifies the operator to be used when pixels in a render target are
* blended with existing pixels in the texture .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* The source color is the value written by the fragment shader . The
* destination color is the value currently existing in the texture .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUBlendOp
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_BLENDOP_INVALID ,
2024-09-04 18:24:11 -07:00
SDL_GPU_BLENDOP_ADD , /**< (source * source_factor) + (destination * destination_factor) */
SDL_GPU_BLENDOP_SUBTRACT , /**< (source * source_factor) - (destination * destination_factor) */
SDL_GPU_BLENDOP_REVERSE_SUBTRACT , /**< (destination * destination_factor) - (source * source_factor) */
SDL_GPU_BLENDOP_MIN , /**< min(source, destination) */
SDL_GPU_BLENDOP_MAX /**< max(source, destination) */
2024-08-29 16:08:10 -07:00
} SDL_GPUBlendOp ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-06 23:39:48 +00:00
* Specifies a blending factor to be used when pixels in a render target are
* blended with existing pixels in the texture .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* The source color is the value written by the fragment shader . The
* destination color is the value currently existing in the texture .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUBlendFactor
2024-03-18 11:43:23 -07:00
{
2024-09-10 18:17:08 -07:00
SDL_GPU_BLENDFACTOR_INVALID ,
2024-09-04 18:24:11 -07:00
SDL_GPU_BLENDFACTOR_ZERO , /**< 0 */
SDL_GPU_BLENDFACTOR_ONE , /**< 1 */
SDL_GPU_BLENDFACTOR_SRC_COLOR , /**< source color */
SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR , /**< 1 - source color */
SDL_GPU_BLENDFACTOR_DST_COLOR , /**< destination color */
SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR , /**< 1 - destination color */
SDL_GPU_BLENDFACTOR_SRC_ALPHA , /**< source alpha */
SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA , /**< 1 - source alpha */
SDL_GPU_BLENDFACTOR_DST_ALPHA , /**< destination alpha */
SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA , /**< 1 - destination alpha */
SDL_GPU_BLENDFACTOR_CONSTANT_COLOR , /**< blend constant */
SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR , /**< 1 - blend constant */
SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE /**< min(source alpha, 1 - destination alpha) */
2024-08-29 16:08:10 -07:00
} SDL_GPUBlendFactor ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies which color components are written in a graphics pipeline .
*
2025-01-21 10:19:21 -08:00
* \ since This datatype is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
*/
2024-08-29 16:08:10 -07:00
typedef Uint8 SDL_GPUColorComponentFlags ;
2024-03-18 11:43:23 -07:00
2024-09-02 19:21:45 -05:00
# define SDL_GPU_COLORCOMPONENT_R (1u << 0) /**< the red component */
# define SDL_GPU_COLORCOMPONENT_G (1u << 1) /**< the green component */
# define SDL_GPU_COLORCOMPONENT_B (1u << 2) /**< the blue component */
# define SDL_GPU_COLORCOMPONENT_A (1u << 3) /**< the alpha component */
2024-09-02 17:19:43 -05:00
2024-09-04 18:24:11 -07:00
/**
* Specifies a filter operation used by a sampler .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUSampler
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUFilter
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_FILTER_NEAREST , /**< Point filtering. */
SDL_GPU_FILTER_LINEAR /**< Linear filtering. */
2024-08-29 16:08:10 -07:00
} SDL_GPUFilter ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies a mipmap mode used by a sampler .
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUSampler
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUSamplerMipmapMode
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_SAMPLERMIPMAPMODE_NEAREST , /**< Point filtering. */
SDL_GPU_SAMPLERMIPMAPMODE_LINEAR /**< Linear filtering. */
2024-08-29 16:08:10 -07:00
} SDL_GPUSamplerMipmapMode ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies behavior of texture sampling when the coordinates exceed the 0 - 1
* range .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_CreateGPUSampler
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUSamplerAddressMode
2024-03-18 11:43:23 -07:00
{
2024-09-04 18:24:11 -07:00
SDL_GPU_SAMPLERADDRESSMODE_REPEAT , /**< Specifies that the coordinates will wrap around. */
SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT , /**< Specifies that the coordinates will wrap around mirrored. */
SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE /**< Specifies that the coordinates will clamp to the 0-1 range. */
2024-08-29 16:08:10 -07:00
} SDL_GPUSamplerAddressMode ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
2024-09-05 01:25:36 +00:00
* Specifies the timing that will be used to present swapchain textures to the
* OS .
2024-09-04 18:24:11 -07:00
*
2024-12-11 19:17:12 +00:00
* VSYNC mode will always be supported . IMMEDIATE and MAILBOX modes may not be
* supported on certain systems .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* It is recommended to query SDL_WindowSupportsGPUPresentMode after claiming
* the window if you wish to change the present mode to IMMEDIATE or MAILBOX .
*
2024-09-05 16:59:20 +00:00
* - VSYNC : Waits for vblank before presenting . No tearing is possible . If
* there is a pending image to present , the new image is enqueued for
2024-12-11 11:16:35 -08:00
* presentation . Disallows tearing at the cost of visual latency .
2024-09-05 09:57:26 -07:00
* - IMMEDIATE : Immediately presents . Lowest latency option , but tearing may
2024-12-11 11:16:35 -08:00
* occur .
2024-09-05 16:59:20 +00:00
* - MAILBOX : Waits for vblank before presenting . No tearing is possible . If
* there is a pending image to present , the pending image is replaced by the
2024-12-11 11:16:35 -08:00
* new image . Similar to VSYNC , but with reduced visual latency .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_SetGPUSwapchainParameters
* \ sa SDL_WindowSupportsGPUPresentMode
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUPresentMode
2024-03-18 11:43:23 -07:00
{
SDL_GPU_PRESENTMODE_VSYNC ,
SDL_GPU_PRESENTMODE_IMMEDIATE ,
SDL_GPU_PRESENTMODE_MAILBOX
2024-08-29 16:08:10 -07:00
} SDL_GPUPresentMode ;
2024-03-18 11:43:23 -07:00
2024-09-04 18:24:11 -07:00
/**
* Specifies the texture format and colorspace of the swapchain textures .
*
2024-09-05 01:25:36 +00:00
* SDR will always be supported . Other compositions may not be supported on
* certain systems .
2024-09-04 18:24:11 -07:00
*
2024-09-05 01:25:36 +00:00
* It is recommended to query SDL_WindowSupportsGPUSwapchainComposition after
* claiming the window if you wish to change the swapchain composition from
* SDR .
2024-09-04 18:24:11 -07:00
*
2024-12-26 12:46:42 +11:00
* - SDR : B8G8R8A8 or R8G8B8A8 swapchain . Pixel values are in sRGB encoding .
* - SDR_LINEAR : B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain . Pixel values are
2024-12-26 18:03:51 +00:00
* stored in memory in sRGB encoding but accessed in shaders in " linear
* sRGB " encoding which is sRGB but with a linear transfer function.
2025-01-21 13:13:52 +10:00
* - HDR_EXTENDED_LINEAR : R16G16B16A16_FLOAT swapchain . Pixel values are in
2024-12-26 12:46:42 +11:00
* extended linear sRGB encoding and permits values outside of the [ 0 , 1 ]
* range .
2024-12-26 13:00:19 +11:00
* - HDR10_ST2084 : A2R10G10B10 or A2B10G10R10 swapchain . Pixel values are in
2024-12-26 12:46:42 +11:00
* BT .2020 ST2084 ( PQ ) encoding .
2024-09-04 18:24:11 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This enum is available since SDL 3.2 .0 .
2024-09-04 18:24:11 -07:00
*
* \ sa SDL_SetGPUSwapchainParameters
* \ sa SDL_WindowSupportsGPUSwapchainComposition
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef enum SDL_GPUSwapchainComposition
2024-03-18 11:43:23 -07:00
{
SDL_GPU_SWAPCHAINCOMPOSITION_SDR ,
SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR ,
SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR ,
2024-12-26 13:00:19 +11:00
SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084
2024-08-29 16:08:10 -07:00
} SDL_GPUSwapchainComposition ;
2024-03-18 11:43:23 -07:00
/* Structures */
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a viewport .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_SetGPUViewport
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUViewport
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
float x ; /**< The left offset of the viewport. */
float y ; /**< The top offset of the viewport. */
float w ; /**< The width of the viewport. */
float h ; /**< The height of the viewport. */
float min_depth ; /**< The minimum depth of the viewport. */
float max_depth ; /**< The maximum depth of the viewport. */
2024-08-29 16:08:10 -07:00
} SDL_GPUViewport ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying parameters related to transferring data to or from a
* texture .
2024-09-07 08:29:14 -07:00
*
2025-03-04 13:27:13 +00:00
* If either of ` pixels_per_row ` or ` rows_per_layer ` is zero , then width and
2025-04-25 03:49:37 +00:00
* height of passed SDL_GPUTextureRegion to SDL_UploadToGPUTexture or
2025-04-25 03:42:51 +00:00
* SDL_DownloadFromGPUTexture are used as default values respectively and data
* is considered to be tightly packed .
2025-03-04 13:27:13 +00:00
*
2025-04-25 14:19:04 -04:00
* * * WARNING * * : Direct3D 12 requires texture data row pitch to be 256 byte
* aligned , and offsets to be aligned to 512 bytes . If they are not , SDL will
* make a temporary copy of the data that is properly aligned , but this adds
* overhead to the transfer process . Apps can avoid this by aligning their
* data appropriately , or using a different GPU backend than Direct3D 12.
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUTexture
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTextureTransferInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTransferBuffer * transfer_buffer ; /**< The transfer buffer used in the transfer operation. */
Uint32 offset ; /**< The starting byte of the image data in the transfer buffer. */
Uint32 pixels_per_row ; /**< The number of pixels from one row to the next. */
Uint32 rows_per_layer ; /**< The number of rows from one layer/depth-slice to the next. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureTransferInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a location in a transfer buffer .
*
* Used when transferring buffer data to or from a transfer buffer .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_UploadToGPUBuffer
* \ sa SDL_DownloadFromGPUBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTransferBufferLocation
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTransferBuffer * transfer_buffer ; /**< The transfer buffer used in the transfer operation. */
Uint32 offset ; /**< The starting byte of the buffer data in the transfer buffer. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTransferBufferLocation ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a location in a texture .
*
* Used when copying data from one texture to another .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CopyGPUTextureToTexture
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTextureLocation
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTexture * texture ; /**< The texture used in the copy operation. */
Uint32 mip_level ; /**< The mip level index of the location. */
Uint32 layer ; /**< The layer index of the location. */
Uint32 x ; /**< The left offset of the location. */
Uint32 y ; /**< The top offset of the location. */
Uint32 z ; /**< The front offset of the location. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureLocation ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a region of a texture .
*
* Used when transferring data to or from a texture .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUTexture
2025-02-02 23:14:17 +00:00
* \ sa SDL_CreateGPUTexture
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTextureRegion
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTexture * texture ; /**< The texture used in the copy operation. */
Uint32 mip_level ; /**< The mip level index to transfer. */
Uint32 layer ; /**< The layer index to transfer. */
2024-09-07 18:02:46 +02:00
Uint32 x ; /**< The left offset of the region. */
Uint32 y ; /**< The top offset of the region. */
Uint32 z ; /**< The front offset of the region. */
Uint32 w ; /**< The width of the region. */
Uint32 h ; /**< The height of the region. */
Uint32 d ; /**< The depth of the region. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureRegion ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a region of a texture used in the blit operation .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BlitGPUTexture
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBlitRegion
2024-03-18 11:43:23 -07:00
{
2025-05-30 16:34:34 +02:00
SDL_GPUTexture * texture ; /**< The texture. */
2024-09-07 08:29:14 -07:00
Uint32 mip_level ; /**< The mip level index of the region. */
Uint32 layer_or_depth_plane ; /**< The layer index or depth plane of the region. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */
Uint32 x ; /**< The left offset of the region. */
Uint32 y ; /**< The top offset of the region. */
Uint32 w ; /**< The width of the region. */
Uint32 h ; /**< The height of the region. */
2024-08-29 16:08:10 -07:00
} SDL_GPUBlitRegion ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a location in a buffer .
*
* Used when copying data between buffers .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CopyGPUBufferToBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBufferLocation
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUBuffer * buffer ; /**< The buffer. */
Uint32 offset ; /**< The starting byte within the buffer. */
2024-08-29 16:08:10 -07:00
} SDL_GPUBufferLocation ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a region of a buffer .
*
* Used when transferring data to or from buffers .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_UploadToGPUBuffer
* \ sa SDL_DownloadFromGPUBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBufferRegion
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUBuffer * buffer ; /**< The buffer. */
Uint32 offset ; /**< The starting byte within the buffer. */
Uint32 size ; /**< The size in bytes of the region. */
2024-08-29 16:08:10 -07:00
} SDL_GPUBufferRegion ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of an indirect draw command .
*
2024-09-07 15:30:40 +00:00
* Note that the ` first_vertex ` and ` first_instance ` parameters are NOT
* compatible with built - in vertex / instance ID variables in shaders ( for
2024-12-24 14:52:32 -05:00
* example , SV_VertexID ) ; GPU APIs and shader languages do not define these
2024-12-31 22:56:38 +00:00
* built - in variables consistently , so if your shader depends on them , the
* only way to keep behavior consistent and portable is to always pass 0 for
* the correlating parameter in the draw calls .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_DrawGPUPrimitivesIndirect
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUIndirectDrawCommand
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
Uint32 num_vertices ; /**< The number of vertices to draw. */
Uint32 num_instances ; /**< The number of instances to draw. */
Uint32 first_vertex ; /**< The index of the first vertex to draw. */
Uint32 first_instance ; /**< The ID of the first instance to draw. */
2024-08-29 16:08:10 -07:00
} SDL_GPUIndirectDrawCommand ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of an indexed indirect draw command .
*
2024-09-07 15:30:40 +00:00
* Note that the ` first_vertex ` and ` first_instance ` parameters are NOT
* compatible with built - in vertex / instance ID variables in shaders ( for
2024-12-24 14:52:32 -05:00
* example , SV_VertexID ) ; GPU APIs and shader languages do not define these
2024-12-31 22:56:38 +00:00
* built - in variables consistently , so if your shader depends on them , the
* only way to keep behavior consistent and portable is to always pass 0 for
* the correlating parameter in the draw calls .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_DrawGPUIndexedPrimitivesIndirect
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUIndexedIndirectDrawCommand
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
Uint32 num_indices ; /**< The number of indices to draw per instance. */
Uint32 num_instances ; /**< The number of instances to draw. */
Uint32 first_index ; /**< The base index within the index buffer. */
Sint32 vertex_offset ; /**< The value added to the vertex index before indexing into the vertex buffer. */
Uint32 first_instance ; /**< The ID of the first instance to draw. */
2024-08-29 16:08:10 -07:00
} SDL_GPUIndexedIndirectDrawCommand ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of an indexed dispatch command .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_DispatchGPUComputeIndirect
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUIndirectDispatchCommand
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
Uint32 groupcount_x ; /**< The number of local workgroups to dispatch in the X dimension. */
Uint32 groupcount_y ; /**< The number of local workgroups to dispatch in the Y dimension. */
Uint32 groupcount_z ; /**< The number of local workgroups to dispatch in the Z dimension. */
2024-08-29 16:08:10 -07:00
} SDL_GPUIndirectDispatchCommand ;
2024-03-18 11:43:23 -07:00
/* State structures */
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a sampler .
*
2025-02-23 20:20:09 +00:00
* Note that mip_lod_bias is a no - op for the Metal driver . For Metal , LOD bias
* must be applied via shader instead .
2025-02-23 13:34:28 -05:00
*
2025-01-21 10:19:21 -08:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUSampler
2025-02-07 02:00:45 +00:00
* \ sa SDL_GPUFilter
* \ sa SDL_GPUSamplerMipmapMode
* \ sa SDL_GPUSamplerAddressMode
* \ sa SDL_GPUCompareOp
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUSamplerCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUFilter min_filter ; /**< The minification filter to apply to lookups. */
SDL_GPUFilter mag_filter ; /**< The magnification filter to apply to lookups. */
SDL_GPUSamplerMipmapMode mipmap_mode ; /**< The mipmap filter to apply to lookups. */
SDL_GPUSamplerAddressMode address_mode_u ; /**< The addressing mode for U coordinates outside [0, 1). */
SDL_GPUSamplerAddressMode address_mode_v ; /**< The addressing mode for V coordinates outside [0, 1). */
SDL_GPUSamplerAddressMode address_mode_w ; /**< The addressing mode for W coordinates outside [0, 1). */
float mip_lod_bias ; /**< The bias to be added to mipmap LOD calculation. */
2024-09-18 07:52:28 -07:00
float max_anisotropy ; /**< The anisotropy value clamp used by the sampler. If enable_anisotropy is false, this is ignored. */
2024-09-10 18:17:08 -07:00
SDL_GPUCompareOp compare_op ; /**< The comparison operator to apply to fetched data before filtering. */
float min_lod ; /**< Clamps the minimum of the computed LOD value. */
float max_lod ; /**< Clamps the maximum of the computed LOD value. */
2025-05-30 16:34:34 +02:00
bool enable_anisotropy ; /**< true to enable anisotropic filtering. */
bool enable_compare ; /**< true to enable comparison against a reference value during lookups. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUSamplerCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-12 18:02:39 -05:00
* A structure specifying the parameters of vertex buffers used in a graphics
* pipeline .
2024-09-07 08:29:14 -07:00
*
2024-09-12 18:02:39 -05:00
* When you call SDL_BindGPUVertexBuffers , you specify the binding slots of
2024-09-07 15:30:40 +00:00
* the vertex buffers . For example if you called SDL_BindGPUVertexBuffers with
2024-09-12 18:02:39 -05:00
* a first_slot of 2 and num_bindings of 3 , the binding slots 2 , 3 , 4 would be
* used by the vertex buffers you pass in .
2024-09-07 08:29:14 -07:00
*
2024-09-12 18:02:39 -05:00
* Vertex attributes are linked to buffers via the buffer_slot field of
2024-09-12 23:03:48 +00:00
* SDL_GPUVertexAttribute . For example , if an attribute has a buffer_slot of
* 0 , then that attribute belongs to the vertex buffer bound at slot 0.
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUVertexAttribute
2025-02-26 21:03:33 +00:00
* \ sa SDL_GPUVertexInputRate
2024-09-07 08:29:14 -07:00
*/
2024-09-12 18:02:39 -05:00
typedef struct SDL_GPUVertexBufferDescription
2024-03-18 11:43:23 -07:00
{
2024-09-12 18:02:39 -05:00
Uint32 slot ; /**< The binding slot of the vertex buffer. */
2025-07-17 18:53:35 +03:00
Uint32 pitch ; /**< The size of a single element + the offset between elements. */
2024-09-07 08:29:14 -07:00
SDL_GPUVertexInputRate input_rate ; /**< Whether attribute addressing is a function of the vertex index or instance index. */
2025-02-24 11:21:09 -05:00
Uint32 instance_step_rate ; /**< Reserved for future use. Must be set to 0. */
2024-09-12 18:02:39 -05:00
} SDL_GPUVertexBufferDescription ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying a vertex attribute .
*
2024-09-12 23:03:48 +00:00
* All vertex attribute locations provided to an SDL_GPUVertexInputState must
* be unique .
2024-09-12 18:02:39 -05:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
2024-09-12 18:02:39 -05:00
* \ sa SDL_GPUVertexBufferDescription
2024-09-07 08:29:14 -07:00
* \ sa SDL_GPUVertexInputState
2025-02-06 22:54:21 +00:00
* \ sa SDL_GPUVertexElementFormat
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUVertexAttribute
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
Uint32 location ; /**< The shader input location index. */
2024-09-12 18:02:39 -05:00
Uint32 buffer_slot ; /**< The binding slot of the associated vertex buffer. */
2024-09-07 08:29:14 -07:00
SDL_GPUVertexElementFormat format ; /**< The size and type of the attribute data. */
Uint32 offset ; /**< The byte offset of this attribute relative to the start of the vertex element. */
2024-08-29 16:08:10 -07:00
} SDL_GPUVertexAttribute ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of a graphics pipeline vertex input
* state .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineCreateInfo
2024-12-27 17:20:36 +00:00
* \ sa SDL_GPUVertexBufferDescription
* \ sa SDL_GPUVertexAttribute
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUVertexInputState
2024-03-18 11:43:23 -07:00
{
2024-09-12 18:02:39 -05:00
const SDL_GPUVertexBufferDescription * vertex_buffer_descriptions ; /**< A pointer to an array of vertex buffer descriptions. */
Uint32 num_vertex_buffers ; /**< The number of vertex buffer descriptions in the above array. */
const SDL_GPUVertexAttribute * vertex_attributes ; /**< A pointer to an array of vertex attribute descriptions. */
Uint32 num_vertex_attributes ; /**< The number of vertex attribute descriptions in the above array. */
2024-08-29 16:08:10 -07:00
} SDL_GPUVertexInputState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the stencil operation state of a graphics pipeline .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUDepthStencilState
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUStencilOpState
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUStencilOp fail_op ; /**< The action performed on samples that fail the stencil test. */
SDL_GPUStencilOp pass_op ; /**< The action performed on samples that pass the depth and stencil tests. */
SDL_GPUStencilOp depth_fail_op ; /**< The action performed on samples that pass the stencil test and fail the depth test. */
SDL_GPUCompareOp compare_op ; /**< The comparison operator used in the stencil test. */
2024-08-29 16:08:10 -07:00
} SDL_GPUStencilOpState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the blend state of a color target .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUColorTargetDescription
2025-05-10 13:38:22 +00:00
* \ sa SDL_GPUBlendFactor
* \ sa SDL_GPUBlendOp
* \ sa SDL_GPUColorComponentFlags
2024-09-07 08:29:14 -07:00
*/
2024-09-06 18:38:23 -05:00
typedef struct SDL_GPUColorTargetBlendState
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUBlendFactor src_color_blendfactor ; /**< The value to be multiplied by the source RGB value. */
SDL_GPUBlendFactor dst_color_blendfactor ; /**< The value to be multiplied by the destination RGB value. */
SDL_GPUBlendOp color_blend_op ; /**< The blend operation for the RGB components. */
SDL_GPUBlendFactor src_alpha_blendfactor ; /**< The value to be multiplied by the source alpha. */
SDL_GPUBlendFactor dst_alpha_blendfactor ; /**< The value to be multiplied by the destination alpha. */
SDL_GPUBlendOp alpha_blend_op ; /**< The blend operation for the alpha component. */
2024-09-18 07:52:28 -07:00
SDL_GPUColorComponentFlags color_write_mask ; /**< A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false. */
2025-05-30 16:34:34 +02:00
bool enable_blend ; /**< Whether blending is enabled for the color target. */
bool enable_color_write_mask ; /**< Whether the color write mask is enabled. */
2024-10-04 10:45:47 -07:00
Uint8 padding1 ;
2024-09-10 18:17:08 -07:00
Uint8 padding2 ;
2024-09-06 18:38:23 -05:00
} SDL_GPUColorTargetBlendState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying code and metadata for creating a shader object .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUShader
2025-05-22 22:39:10 +00:00
* \ sa SDL_GPUShaderFormat
* \ sa SDL_GPUShaderStage
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUShaderCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
size_t code_size ; /**< The size in bytes of the code pointed to. */
const Uint8 * code ; /**< A pointer to shader code. */
const char * entrypoint ; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */
SDL_GPUShaderFormat format ; /**< The format of the shader code. */
SDL_GPUShaderStage stage ; /**< The stage the shader program corresponds to. */
Uint32 num_samplers ; /**< The number of samplers defined in the shader. */
Uint32 num_storage_textures ; /**< The number of storage textures defined in the shader. */
Uint32 num_storage_buffers ; /**< The number of storage buffers defined in the shader. */
Uint32 num_uniform_buffers ; /**< The number of uniform buffers defined in the shader. */
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUShaderCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a texture .
*
2024-09-07 15:30:40 +00:00
* Usage flags can be bitwise OR ' d together for combinations of usages . Note
* that certain usage combinations are invalid , for example SAMPLER and
* GRAPHICS_STORAGE .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUTexture
2024-12-28 01:12:59 +00:00
* \ sa SDL_GPUTextureType
* \ sa SDL_GPUTextureFormat
* \ sa SDL_GPUTextureUsageFlags
* \ sa SDL_GPUSampleCount
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTextureCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTextureType type ; /**< The base dimensionality of the texture. */
SDL_GPUTextureFormat format ; /**< The pixel format of the texture. */
SDL_GPUTextureUsageFlags usage ; /**< How the texture is intended to be used by the client. */
Uint32 width ; /**< The width of the texture. */
Uint32 height ; /**< The height of the texture. */
Uint32 layer_count_or_depth ; /**< The layer count or depth of the texture. This value is treated as a layer count on 2D array textures, and as a depth value on 3D textures. */
Uint32 num_levels ; /**< The number of mip levels in the texture. */
SDL_GPUSampleCount sample_count ; /**< The number of samples per texel. Only applies if the texture is used as a render target. */
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a buffer .
*
2024-09-07 15:30:40 +00:00
* Usage flags can be bitwise OR ' d together for combinations of usages . Note
* that certain combinations are invalid , for example VERTEX and INDEX .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUBuffer
2024-12-23 05:32:13 +00:00
* \ sa SDL_GPUBufferUsageFlags
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBufferCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 18:02:46 +02:00
SDL_GPUBufferUsageFlags usage ; /**< How the buffer is intended to be used by the client. */
Uint32 size ; /**< The size in bytes of the buffer. */
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUBufferCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a transfer buffer .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUTransferBuffer
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTransferBufferCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 18:02:46 +02:00
SDL_GPUTransferBufferUsage usage ; /**< How the transfer buffer is intended to be used by the client. */
Uint32 size ; /**< The size in bytes of the transfer buffer. */
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTransferBufferCreateInfo ;
2024-03-18 11:43:23 -07:00
/* Pipeline state structures */
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of the graphics pipeline rasterizer
* state .
2024-09-07 08:29:14 -07:00
*
2025-02-23 13:34:28 -05:00
* Note that SDL_GPU_FILLMODE_LINE is not supported on many Android devices .
* For those devices , the fill mode will automatically fall back to FILL .
*
* Also note that the D3D12 driver will enable depth clamping even if
* enable_depth_clip is true . If you need this clamp + clip behavior , consider
* enabling depth clip and then manually clamping depth in your fragment
* shaders on Metal and Vulkan .
2024-09-27 11:18:54 -05:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineCreateInfo
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPURasterizerState
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUFillMode fill_mode ; /**< Whether polygons will be filled in or drawn as lines. */
SDL_GPUCullMode cull_mode ; /**< The facing direction in which triangles will be culled. */
SDL_GPUFrontFace front_face ; /**< The vertex winding that will cause a triangle to be determined as front-facing. */
2024-09-10 18:17:08 -07:00
float depth_bias_constant_factor ; /**< A scalar factor controlling the depth value added to each fragment. */
float depth_bias_clamp ; /**< The maximum depth bias of a fragment. */
float depth_bias_slope_factor ; /**< A scalar factor applied to a fragment's slope in depth calculations. */
2025-05-30 16:34:34 +02:00
bool enable_depth_bias ; /**< true to bias fragment depth values. */
bool enable_depth_clip ; /**< true to enable depth clip, false to enable depth clamp. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
2024-08-29 16:08:10 -07:00
} SDL_GPURasterizerState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of the graphics pipeline multisample
* state .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineCreateInfo
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUMultisampleState
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUSampleCount sample_count ; /**< The number of samples to be used in rasterization. */
2025-02-24 11:21:09 -05:00
Uint32 sample_mask ; /**< Reserved for future use. Must be set to 0. */
2025-05-30 16:34:34 +02:00
bool enable_mask ; /**< Reserved for future use. Must be set to false. */
2025-04-03 17:47:37 -04:00
bool enable_alpha_to_coverage ; /**< true enables the alpha-to-coverage feature. */
2024-09-10 18:17:08 -07:00
Uint8 padding2 ;
Uint8 padding3 ;
2024-08-29 16:08:10 -07:00
} SDL_GPUMultisampleState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of the graphics pipeline depth
* stencil state .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineCreateInfo
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUDepthStencilState
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUCompareOp compare_op ; /**< The comparison operator used for depth testing. */
SDL_GPUStencilOpState back_stencil_state ; /**< The stencil op state for back-facing triangles. */
SDL_GPUStencilOpState front_stencil_state ; /**< The stencil op state for front-facing triangles. */
Uint8 compare_mask ; /**< Selects the bits of the stencil values participating in the stencil test. */
Uint8 write_mask ; /**< Selects the bits of the stencil values updated by the stencil test. */
2025-05-30 16:34:34 +02:00
bool enable_depth_test ; /**< true enables the depth test. */
bool enable_depth_write ; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */
bool enable_stencil_test ; /**< true enables the stencil test. */
2024-09-10 18:17:08 -07:00
Uint8 padding1 ;
2024-09-05 09:52:57 -07:00
Uint8 padding2 ;
2024-09-05 17:41:23 -05:00
Uint8 padding3 ;
2024-08-29 16:08:10 -07:00
} SDL_GPUDepthStencilState ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of color targets used in a graphics
* pipeline .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineTargetInfo
*/
2024-09-06 18:38:23 -05:00
typedef struct SDL_GPUColorTargetDescription
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTextureFormat format ; /**< The pixel format of the texture to be used as a color target. */
SDL_GPUColorTargetBlendState blend_state ; /**< The blend state to be used for the color target. */
2024-09-06 18:38:23 -05:00
} SDL_GPUColorTargetDescription ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the descriptions of render targets used in a
* graphics pipeline .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_GPUGraphicsPipelineCreateInfo
2025-02-15 17:42:27 +00:00
* \ sa SDL_GPUColorTargetDescription
* \ sa SDL_GPUTextureFormat
2024-09-07 08:29:14 -07:00
*/
2024-09-15 07:46:26 -07:00
typedef struct SDL_GPUGraphicsPipelineTargetInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
const SDL_GPUColorTargetDescription * color_target_descriptions ; /**< A pointer to an array of color target descriptions. */
Uint32 num_color_targets ; /**< The number of color target descriptions in the above array. */
2024-09-18 07:52:28 -07:00
SDL_GPUTextureFormat depth_stencil_format ; /**< The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false. */
2025-05-30 16:34:34 +02:00
bool has_depth_stencil_target ; /**< true specifies that the pipeline uses a depth-stencil target. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
2024-09-15 07:46:26 -07:00
} SDL_GPUGraphicsPipelineTargetInfo ;
2024-08-29 16:08:10 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a graphics pipeline state .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUGraphicsPipeline
2025-01-31 00:56:29 +00:00
* \ sa SDL_GPUShader
2024-12-20 15:57:39 +00:00
* \ sa SDL_GPUVertexInputState
* \ sa SDL_GPUPrimitiveType
* \ sa SDL_GPURasterizerState
* \ sa SDL_GPUMultisampleState
* \ sa SDL_GPUDepthStencilState
* \ sa SDL_GPUGraphicsPipelineTargetInfo
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUGraphicsPipelineCreateInfo
{
2024-09-07 08:29:14 -07:00
SDL_GPUShader * vertex_shader ; /**< The vertex shader used by the graphics pipeline. */
SDL_GPUShader * fragment_shader ; /**< The fragment shader used by the graphics pipeline. */
SDL_GPUVertexInputState vertex_input_state ; /**< The vertex layout of the graphics pipeline. */
SDL_GPUPrimitiveType primitive_type ; /**< The primitive topology of the graphics pipeline. */
SDL_GPURasterizerState rasterizer_state ; /**< The rasterizer state of the graphics pipeline. */
SDL_GPUMultisampleState multisample_state ; /**< The multisample state of the graphics pipeline. */
SDL_GPUDepthStencilState depth_stencil_state ; /**< The depth-stencil state of the graphics pipeline. */
2024-09-15 07:46:26 -07:00
SDL_GPUGraphicsPipelineTargetInfo target_info ; /**< Formats and blend modes for the render targets of the graphics pipeline. */
2024-09-07 08:29:14 -07:00
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUGraphicsPipelineCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying the parameters of a compute pipeline state .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_CreateGPUComputePipeline
2025-01-31 01:04:48 +00:00
* \ sa SDL_GPUShaderFormat
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUComputePipelineCreateInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
size_t code_size ; /**< The size in bytes of the compute shader code pointed to. */
const Uint8 * code ; /**< A pointer to compute shader code. */
const char * entrypoint ; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */
SDL_GPUShaderFormat format ; /**< The format of the compute shader code. */
2024-09-10 19:20:14 -07:00
Uint32 num_samplers ; /**< The number of samplers defined in the shader. */
2024-09-07 08:29:14 -07:00
Uint32 num_readonly_storage_textures ; /**< The number of readonly storage textures defined in the shader. */
Uint32 num_readonly_storage_buffers ; /**< The number of readonly storage buffers defined in the shader. */
2024-09-27 12:49:37 -07:00
Uint32 num_readwrite_storage_textures ; /**< The number of read-write storage textures defined in the shader. */
Uint32 num_readwrite_storage_buffers ; /**< The number of read-write storage buffers defined in the shader. */
2024-09-07 18:02:46 +02:00
Uint32 num_uniform_buffers ; /**< The number of uniform buffers defined in the shader. */
Uint32 threadcount_x ; /**< The number of threads in the X dimension. This should match the value in the shader. */
Uint32 threadcount_y ; /**< The number of threads in the Y dimension. This should match the value in the shader. */
Uint32 threadcount_z ; /**< The number of threads in the Z dimension. This should match the value in the shader. */
2024-09-07 08:29:14 -07:00
SDL_PropertiesID props ; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
2024-08-29 16:08:10 -07:00
} SDL_GPUComputePipelineCreateInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of a color target used by a render
* pass .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The load_op field determines what is done with the texture at the beginning
* of the render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-16 12:19:09 -05:00
* - LOAD : Loads the data currently in the texture . Not recommended for
* multisample textures as it requires significant memory bandwidth .
2024-09-07 08:29:14 -07:00
* - CLEAR : Clears the texture to a single color .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the texture memory .
* This is a good option if you know that every single pixel will be touched
* in the render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The store_op field determines what is done with the color results of the
* render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-16 17:19:42 +00:00
* - STORE : Stores the results of the render pass in the texture . Not
* recommended for multisample textures as it requires significant memory
* bandwidth .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the texture memory .
* This is often a good option for depth / stencil textures .
2024-09-16 17:19:42 +00:00
* - RESOLVE : Resolves a multisample texture into resolve_texture , which must
* have a sample count of 1. Then the driver may discard the multisample
* texture memory . This is the most performant method of resolving a
* multisample target .
* - RESOLVE_AND_STORE : Resolves a multisample texture into the
* resolve_texture , which must have a sample count of 1. Then the driver
* stores the multisample texture ' s contents . Not recommended as it requires
* significant memory bandwidth .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BeginGPURenderPass
2025-08-27 22:35:48 +00:00
* \ sa SDL_FColor
2024-09-07 08:29:14 -07:00
*/
2024-09-06 18:38:23 -05:00
typedef struct SDL_GPUColorTargetInfo
2024-03-18 11:43:23 -07:00
{
2024-09-16 12:19:09 -05:00
SDL_GPUTexture * texture ; /**< The texture that will be used as a color target by a render pass. */
Uint32 mip_level ; /**< The mip level to use as a color target. */
Uint32 layer_or_depth_plane ; /**< The layer index or depth plane to use as a color target. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */
SDL_FColor clear_color ; /**< The color to clear the color target to at the start of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
SDL_GPULoadOp load_op ; /**< What is done with the contents of the color target at the beginning of the render pass. */
SDL_GPUStoreOp store_op ; /**< What is done with the results of the render pass. */
SDL_GPUTexture * resolve_texture ; /**< The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used. */
Uint32 resolve_mip_level ; /**< The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */
Uint32 resolve_layer ; /**< The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */
2025-05-30 16:34:34 +02:00
bool cycle ; /**< true cycles the texture if the texture is bound and load_op is not LOAD */
bool cycle_resolve_texture ; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
2024-09-06 18:38:23 -05:00
} SDL_GPUColorTargetInfo ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying the parameters of a depth - stencil target used by a
* render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The load_op field determines what is done with the depth contents of the
* texture at the beginning of the render pass .
2024-09-07 08:29:14 -07:00
*
* - LOAD : Loads the depth values currently in the texture .
* - CLEAR : Clears the texture to a single depth .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the memory . This is
* a good option if you know that every single pixel will be touched in the
* render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The store_op field determines what is done with the depth results of the
* render pass .
2024-09-07 08:29:14 -07:00
*
* - STORE : Stores the depth results in the texture .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the depth results .
* This is often a good option for depth / stencil textures that don ' t need to
* be reused again .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The stencil_load_op field determines what is done with the stencil contents
* of the texture at the beginning of the render pass .
2024-09-07 08:29:14 -07:00
*
* - LOAD : Loads the stencil values currently in the texture .
* - CLEAR : Clears the stencil values to a single value .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the memory . This is
* a good option if you know that every single pixel will be touched in the
* render pass .
2024-09-07 08:29:14 -07:00
*
2024-09-07 15:30:40 +00:00
* The stencil_store_op field determines what is done with the stencil results
* of the render pass .
2024-09-07 08:29:14 -07:00
*
* - STORE : Stores the stencil results in the texture .
2024-09-07 15:30:40 +00:00
* - DONT_CARE : The driver will do whatever it wants with the stencil results .
* This is often a good option for depth / stencil textures that don ' t need to
* be reused again .
2024-09-07 08:29:14 -07:00
*
2024-09-16 12:19:09 -05:00
* Note that depth / stencil targets do not support multisample resolves .
*
2025-09-13 14:13:03 +00:00
* Due to ABI limitations , depth textures with more than 255 layers are not
* supported .
2025-09-12 13:14:38 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BeginGPURenderPass
*/
2024-09-06 18:38:23 -05:00
typedef struct SDL_GPUDepthStencilTargetInfo
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTexture * texture ; /**< The texture that will be used as the depth stencil target by the render pass. */
2024-09-09 10:40:14 -07:00
float clear_depth ; /**< The value to clear the depth component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
2024-09-07 08:29:14 -07:00
SDL_GPULoadOp load_op ; /**< What is done with the depth contents at the beginning of the render pass. */
SDL_GPUStoreOp store_op ; /**< What is done with the depth results of the render pass. */
SDL_GPULoadOp stencil_load_op ; /**< What is done with the stencil contents at the beginning of the render pass. */
SDL_GPUStoreOp stencil_store_op ; /**< What is done with the stencil results of the render pass. */
2025-05-30 16:34:34 +02:00
bool cycle ; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */
2024-09-09 10:40:14 -07:00
Uint8 clear_stencil ; /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
2025-09-12 13:14:38 -07:00
Uint8 mip_level ; /**< The mip level to use as the depth stencil target. */
Uint8 layer ; /**< The layer index to use as the depth stencil target. */
2024-09-06 18:38:23 -05:00
} SDL_GPUDepthStencilTargetInfo ;
2024-03-18 11:43:23 -07:00
2024-09-09 10:19:52 -07:00
/**
* A structure containing parameters for a blit command .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-09 10:19:52 -07:00
*
* \ sa SDL_BlitGPUTexture
*/
typedef struct SDL_GPUBlitInfo {
SDL_GPUBlitRegion source ; /**< The source region for the blit. */
SDL_GPUBlitRegion destination ; /**< The destination region for the blit. */
SDL_GPULoadOp load_op ; /**< What is done with the contents of the destination before the blit. */
SDL_FColor clear_color ; /**< The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR. */
SDL_FlipMode flip_mode ; /**< The flip mode for the source region. */
SDL_GPUFilter filter ; /**< The filter mode used when blitting. */
2025-05-30 16:34:34 +02:00
bool cycle ; /**< true cycles the destination texture if it is already bound. */
2024-09-10 18:17:08 -07:00
Uint8 padding1 ;
2024-09-09 10:19:52 -07:00
Uint8 padding2 ;
Uint8 padding3 ;
} SDL_GPUBlitInfo ;
2024-09-27 00:30:18 -07:00
2024-03-18 11:43:23 -07:00
/* Binding structs */
2024-09-07 08:29:14 -07:00
/**
* A structure specifying parameters in a buffer binding call .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BindGPUVertexBuffers
2024-11-21 17:43:08 +01:00
* \ sa SDL_BindGPUIndexBuffer
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUBufferBinding
2024-03-18 11:43:23 -07:00
{
2024-11-21 17:43:08 +01:00
SDL_GPUBuffer * buffer ; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_VERTEX for SDL_BindGPUVertexBuffers, or SDL_GPU_BUFFERUSAGE_INDEX for SDL_BindGPUIndexBuffer. */
2024-09-07 08:29:14 -07:00
Uint32 offset ; /**< The starting byte of the data to bind in the buffer. */
2024-08-29 16:08:10 -07:00
} SDL_GPUBufferBinding ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
* A structure specifying parameters in a sampler binding call .
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BindGPUVertexSamplers
* \ sa SDL_BindGPUFragmentSamplers
2025-08-29 03:02:44 +00:00
* \ sa SDL_GPUTexture
* \ sa SDL_GPUSampler
2024-09-07 08:29:14 -07:00
*/
2024-08-29 16:08:10 -07:00
typedef struct SDL_GPUTextureSamplerBinding
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUTexture * texture ; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. */
SDL_GPUSampler * sampler ; /**< The sampler to bind. */
2024-08-29 16:08:10 -07:00
} SDL_GPUTextureSamplerBinding ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying parameters related to binding buffers in a compute
* pass .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BeginGPUComputePass
*/
2024-09-27 12:49:37 -07:00
typedef struct SDL_GPUStorageBufferReadWriteBinding
2024-03-18 11:43:23 -07:00
{
2024-09-07 08:29:14 -07:00
SDL_GPUBuffer * buffer ; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE. */
2024-09-27 12:49:37 -07:00
bool cycle ; /**< true cycles the buffer if it is already bound. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
2024-09-27 12:49:37 -07:00
} SDL_GPUStorageBufferReadWriteBinding ;
2024-03-18 11:43:23 -07:00
2024-09-07 08:29:14 -07:00
/**
2024-09-07 15:30:40 +00:00
* A structure specifying parameters related to binding textures in a compute
* pass .
2024-09-07 08:29:14 -07:00
*
2025-01-21 10:19:21 -08:00
* \ since This struct is available since SDL 3.2 .0 .
2024-09-07 08:29:14 -07:00
*
* \ sa SDL_BeginGPUComputePass
*/
2024-09-27 12:49:37 -07:00
typedef struct SDL_GPUStorageTextureReadWriteBinding
2024-03-18 11:43:23 -07:00
{
2024-09-27 12:49:37 -07:00
SDL_GPUTexture * texture ; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE or SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE. */
2024-09-07 08:29:14 -07:00
Uint32 mip_level ; /**< The mip level index to bind. */
Uint32 layer ; /**< The layer index to bind. */
2024-09-27 12:49:37 -07:00
bool cycle ; /**< true cycles the texture if it is already bound. */
2024-09-05 09:52:57 -07:00
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
2024-09-27 12:49:37 -07:00
} SDL_GPUStorageTextureReadWriteBinding ;
2024-03-18 11:43:23 -07:00
/* Functions */
/* Device */
2024-09-13 13:23:55 -04:00
/**
* Checks for GPU runtime support .
*
* \ param format_flags a bitflag indicating which shader formats the app is
* able to provide .
* \ param name the preferred GPU driver , or NULL to let SDL pick the optimal
* driver .
2024-09-18 07:52:28 -07:00
* \ returns true if supported , false otherwise .
2024-09-13 13:23:55 -04:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-13 13:23:55 -04:00
*
* \ sa SDL_CreateGPUDevice
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsShaderFormats (
2024-09-13 13:23:55 -04:00
SDL_GPUShaderFormat format_flags ,
const char * name ) ;
/**
* Checks for GPU runtime support .
*
* \ param props the properties to use .
2024-09-18 07:52:28 -07:00
* \ returns true if supported , false otherwise .
2024-09-13 13:23:55 -04:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-13 13:23:55 -04:00
*
* \ sa SDL_CreateGPUDeviceWithProperties
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties (
2024-09-13 13:23:55 -04:00
SDL_PropertiesID props ) ;
2024-03-18 11:43:23 -07:00
/**
* Creates a GPU context .
*
2025-04-22 14:50:56 +00:00
* The GPU driver name can be one of the following :
*
* - " vulkan " : [ Vulkan ] ( CategoryGPU # vulkan )
* - " direct3d12 " : [ D3D12 ] ( CategoryGPU # d3d12 )
* - " metal " : [ Metal ] ( CategoryGPU # metal )
* - NULL : let SDL pick the optimal driver
*
2024-09-06 18:38:23 -05:00
* \ param format_flags a bitflag indicating which shader formats the app is
2024-09-06 23:39:48 +00:00
* able to provide .
2024-09-06 18:38:23 -05:00
* \ param debug_mode enable debug mode properties and validations .
2024-08-29 22:58:01 +00:00
* \ param name the preferred GPU driver , or NULL to let SDL pick the optimal
* driver .
2024-09-27 07:30:57 +00:00
* \ returns a GPU context on success or NULL on failure ; call SDL_GetError ( )
* for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2025-04-22 14:50:56 +00:00
* \ sa SDL_CreateGPUDeviceWithProperties
2024-09-13 11:16:43 -04:00
* \ sa SDL_GetGPUShaderFormats
* \ sa SDL_GetGPUDeviceDriver
2024-08-29 16:08:10 -07:00
* \ sa SDL_DestroyGPUDevice
2024-09-13 23:08:44 -04:00
* \ sa SDL_GPUSupportsShaderFormats
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice (
2024-09-06 18:38:23 -05:00
SDL_GPUShaderFormat format_flags ,
2024-09-18 07:52:28 -07:00
bool debug_mode ,
2024-03-18 11:43:23 -07:00
const char * name ) ;
/**
* Creates a GPU context .
*
* These are the supported properties :
*
2024-10-15 22:37:00 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN ` : enable debug mode
* properties and validations , defaults to true .
* - ` SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN ` : enable to prefer
* energy efficiency over maximum GPU performance , defaults to false .
2025-04-02 17:29:29 +11:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN ` : enable to automatically log
* useful debug information on device creation , defaults to true .
2024-08-29 16:20:26 -07:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING ` : the name of the GPU driver to
2024-08-29 16:23:47 -07:00
* use , if a specific one is desired .
2025-09-29 19:44:11 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN ` : Enable Vulkan
* device feature shaderClipDistance . If disabled , clip distances are not
2025-09-29 06:55:36 -07:00
* supported in shader code : gl_ClipDistance [ ] built - ins of GLSL ,
* SV_ClipDistance0 / 1 semantics of HLSL and [ [ clip_distance ] ] attribute of
2025-09-29 19:44:11 +00:00
* Metal . Disabling optional features allows the application to run on some
* older Android devices . Defaults to true .
* - ` SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN ` : Enable
* Vulkan device feature depthClamp . If disabled , there is no depth clamp
* support and enable_depth_clip in SDL_GPURasterizerState must always be
* set to true . Disabling optional features allows the application to run on
* some older Android devices . Defaults to true .
* - ` SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN ` :
* Enable Vulkan device feature drawIndirectFirstInstance . If disabled , the
* argument first_instance of SDL_GPUIndirectDrawCommand must be set to
* zero . Disabling optional features allows the application to run on some
* older Android devices . Defaults to true .
* - ` SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN ` : Enable Vulkan
* device feature samplerAnisotropy . If disabled , enable_anisotropy of
* SDL_GPUSamplerCreateInfo must be set to false . Disabling optional
* features allows the application to run on some older Android devices .
* Defaults to true .
2024-03-18 11:43:23 -07:00
*
* These are the current shader format properties :
*
2024-10-15 15:20:01 -07:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN ` : The app is able to
2024-08-30 00:35:24 +00:00
* provide shaders for an NDA platform .
2024-10-15 15:20:01 -07:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN ` : The app is able to
2024-08-30 00:35:24 +00:00
* provide SPIR - V shaders if applicable .
2024-10-15 15:20:01 -07:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN ` : The app is able to
2024-10-06 18:31:17 +00:00
* provide DXBC shaders if applicable
2025-01-08 19:57:05 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN ` : The app is able to
2024-08-30 00:35:24 +00:00
* provide DXIL shaders if applicable .
2024-10-15 22:37:00 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN ` : The app is able to
* provide MSL shaders if applicable .
2024-10-15 15:20:01 -07:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN ` : The app is able to
2024-08-30 00:35:24 +00:00
* provide Metal shader libraries if applicable .
2024-08-29 22:58:01 +00:00
*
2025-11-10 18:30:59 -08:00
* With the D3D12 backend :
2024-08-29 16:23:47 -07:00
*
2024-08-30 00:35:24 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING ` : the prefix to
* use for all vertex semantics , default is " TEXCOORD " .
2025-09-08 18:20:40 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN ` : By
* default , Resourcing Binding Tier 2 is required for D3D12 support .
2025-09-11 21:10:18 -07:00
* However , an application can set this property to true to enable Tier 1
2025-09-08 18:20:40 +00:00
* support , if ( and only if ) the application uses 8 or fewer storage
* resources across all shader stages . As of writing , this property is
* useful for targeting Intel Haswell and Broadwell GPUs ; other hardware
* either supports Tier 2 Resource Binding or does not support D3D12 in any
2025-09-11 21:10:18 -07:00
* capacity . Defaults to false .
2024-03-18 11:43:23 -07:00
*
2025-11-10 18:30:59 -08:00
* With the Vulkan backend :
*
2025-11-11 15:38:49 +00:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN ` :
* By default , Vulkan device enumeration includes drivers of all types ,
* including software renderers ( for example , the Lavapipe Mesa driver ) .
* This can be useful if your application _requires_ SDL_GPU , but if you can
* provide your own fallback renderer ( for example , an OpenGL renderer ) this
* property can be set to true . Defaults to false .
2025-11-11 20:49:14 -08:00
* - ` SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER ` : a pointer to an
2025-11-12 00:53:06 +01:00
* SDL_GPUVulkanOptions structure to be processed during device creation .
* This allows configuring a variety of Vulkan - specific options such as
* increasing the API version and opting into extensions aside from the
2025-11-11 20:49:14 -08:00
* minimal set SDL requires .
2025-11-11 23:54:29 +00:00
*
2024-03-18 11:43:23 -07:00
* \ param props the properties to use .
2024-09-27 07:30:57 +00:00
* \ returns a GPU context on success or NULL on failure ; call SDL_GetError ( )
* for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-09-13 11:16:43 -04:00
* \ sa SDL_GetGPUShaderFormats
* \ sa SDL_GetGPUDeviceDriver
2024-08-29 16:08:10 -07:00
* \ sa SDL_DestroyGPUDevice
2024-09-13 23:08:44 -04:00
* \ sa SDL_GPUSupportsProperties
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDeviceWithProperties (
2024-03-18 11:43:23 -07:00
SDL_PropertiesID props ) ;
2025-09-29 06:55:36 -07:00
# define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode"
# define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower"
# define SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN "SDL.gpu.device.create.verbose"
# define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name"
# define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN "SDL.gpu.device.create.feature.clip_distance"
# define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN "SDL.gpu.device.create.feature.depth_clamping"
# define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN "SDL.gpu.device.create.feature.indirect_draw_first_instance"
# define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN "SDL.gpu.device.create.feature.anisotropy"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl"
# define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib"
# define SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN "SDL.gpu.device.create.d3d12.allowtier1resourcebinding"
# define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic"
2025-11-11 14:38:58 +01:00
# define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN "SDL.gpu.device.create.vulkan.requirehardwareacceleration"
2025-11-12 00:53:06 +01:00
# define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER "SDL.gpu.device.create.vulkan.options"
/**
* A structure specifying additional options when using Vulkan .
*
* When no such structure is provided , SDL will use Vulkan API version 1.0 and
2025-11-11 23:54:29 +00:00
* a minimal set of features . The requested API version influences how the
* feature_list is processed by SDL . When requesting API version 1.0 , the
2025-12-07 16:05:39 +00:00
* feature_list is ignored . Only the vulkan_10_physical_device_features and
2025-11-11 23:54:29 +00:00
* the extension lists are used . When requesting API version 1.1 , the
* feature_list is scanned for feature structures introduced in Vulkan 1.1 .
* When requesting Vulkan 1.2 or higher , the feature_list is additionally
* scanned for compound feature structs such as
* VkPhysicalDeviceVulkan11Features . The device and instance extension lists ,
2025-11-11 20:49:14 -08:00
* as well as vulkan_10_physical_device_features , are always processed .
2025-11-12 00:53:06 +01:00
*
2025-11-11 23:54:29 +00:00
* \ since This struct is available since SDL 3.4 .0 .
2025-11-12 00:53:06 +01:00
*/
typedef struct SDL_GPUVulkanOptions
{
Uint32 vulkan_api_version ; /**< The Vulkan API version to request for the instance. Use Vulkan's VK_MAKE_VERSION or VK_MAKE_API_VERSION. */
void * feature_list ; /**< Pointer to the first element of a chain of Vulkan feature structs. (Requires API version 1.1 or higher.)*/
void * vulkan_10_physical_device_features ; /**< Pointer to a VkPhysicalDeviceFeatures struct to enable additional Vulkan 1.0 features. */
Uint32 device_extension_count ; /**< Number of additional device extensions to require. */
const char * * device_extension_names ; /**< Pointer to a list of additional device extensions to require. */
Uint32 instance_extension_count ; /**< Number of additional instance extensions to require. */
const char * * instance_extension_names ; /**< Pointer to a list of additional instance extensions to require. */
} SDL_GPUVulkanOptions ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 16:08:10 -07:00
* Destroys a GPU context previously returned by SDL_CreateGPUDevice .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context to destroy .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_CreateGPUDevice
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice ( SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
/**
2024-09-13 11:16:43 -04:00
* Get the number of GPU drivers compiled into SDL .
*
* \ returns the number of built in GPU drivers .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-13 11:16:43 -04:00
*
* \ sa SDL_GetGPUDriver
*/
extern SDL_DECLSPEC int SDLCALL SDL_GetNumGPUDrivers ( void ) ;
/**
* Get the name of a built in GPU driver .
*
* The GPU drivers are presented in the order in which they are normally
* checked during initialization .
*
* The names of drivers are all simple , low - ASCII identifiers , like " vulkan " ,
* " metal " or " direct3d12 " . These never have Unicode characters , and are not
* meant to be proper names .
*
* \ param index the index of a GPU driver .
* \ returns the name of the GPU driver with the given * * index * * .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-13 11:16:43 -04:00
*
* \ sa SDL_GetNumGPUDrivers
*/
extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDriver ( int index ) ;
/**
* Returns the name of the backend used to create this GPU context .
*
* \ param device a GPU context to query .
* \ returns the name of the device ' s driver , or NULL on error .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-13 11:16:43 -04:00
*/
extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver ( SDL_GPUDevice * device ) ;
/**
* Returns the supported shader formats for this GPU context .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context to query .
2024-09-13 16:30:11 +00:00
* \ returns a bitflag indicating which shader formats the driver is able to
* consume .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-09-13 11:16:43 -04:00
extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats ( SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
2025-04-02 17:29:29 +11:00
/**
2025-04-03 14:04:48 -07:00
* Get the properties associated with a GPU device .
2025-04-03 15:53:43 +00:00
*
2025-04-03 22:00:01 +00:00
* All properties are optional and may differ between GPU backends and SDL
* versions .
2025-04-02 17:29:29 +11:00
*
* The following properties are provided by SDL :
*
2025-04-04 11:39:23 -04:00
* ` SDL_PROP_GPU_DEVICE_NAME_STRING ` : Contains the name of the underlying
* device as reported by the system driver . This string has no standardized
2025-04-04 15:40:48 +00:00
* format , is highly inconsistent between hardware devices and drivers , and is
* able to change at any time . Do not attempt to parse this string as it is
* bound to fail at some point in the future when system drivers are updated ,
* new hardware devices are introduced , or when SDL adds new GPU backends or
* modifies existing ones .
2025-04-04 11:39:23 -04:00
*
* Strings that have been found in the wild include :
*
* - GTX 970
* - GeForce GTX 970
* - NVIDIA GeForce GTX 970
* - Microsoft Direct3D12 ( NVIDIA GeForce GTX 970 )
* - NVIDIA Graphics Device
* - GeForce GPU
* - P106 - 100
* - AMD 15 D8 : C9
* - AMD Custom GPU 0405
* - AMD Radeon ( TM ) Graphics
* - ASUS Radeon RX 470 Series
* - Intel ( R ) Arc ( tm ) A380 Graphics ( DG2 )
* - Virtio - GPU Venus ( NVIDIA TITAN V )
* - SwiftShader Device ( LLVM 16.0 .0 )
* - llvmpipe ( LLVM 15.0 .4 , 256 bits )
* - Microsoft Basic Render Driver
* - unknown device
*
* The above list shows that the same device can have different formats , the
* vendor name may or may not appear in the string , the included vendor name
* may not be the vendor of the chipset on the device , some manufacturers
* include pseudo - legal marks while others don ' t , some devices may not use a
* marketing name in the string , the device string may be wrapped by the name
* of a translation interface , the device may be emulated in software , or the
* string may contain generic text that does not identify the device at all .
*
* ` SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING ` : Contains the self - reported name
* of the underlying system driver .
*
* Strings that have been found in the wild include :
*
* - Intel Corporation
* - Intel open - source Mesa driver
* - Qualcomm Technologies Inc . Adreno Vulkan Driver
* - MoltenVK
* - Mali - G715
* - venus
*
* ` SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING ` : Contains the self - reported
* version of the underlying system driver . This is a relatively short version
* string in an unspecified format . If SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING
* is available then that property should be preferred over this one as it may
* contain additional information that is useful for identifying the exact
* driver version used .
*
* Strings that have been found in the wild include :
*
* - 53.0 .0
* - 0.405 .2463
* - 32.0 .15 .6614
*
* ` SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING ` : Contains the detailed version
* information of the underlying system driver as reported by the driver . This
* is an arbitrary string with no standardized format and it may contain
* newlines . This property should be preferred over
2025-04-04 15:40:48 +00:00
* SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING if it is available as it usually
* contains the same information but in a format that is easier to read .
2025-04-04 11:39:23 -04:00
*
* Strings that have been found in the wild include :
*
* - 101.6559
* - 1.2 .11
* - Mesa 21.2 .2 ( LLVM 12.0 .1 )
* - Mesa 22.2 .0 - devel ( git - f226222 2022 - 04 - 14 impish - oibaf - ppa )
* - v1 . r53p0 - 00 eac0 .824 c4f31403fb1fbf8ee1042422c2129
*
* This string has also been observed to be a multiline string ( which has a
* trailing newline ) :
2025-04-04 14:35:40 +00:00
*
* ` ` `
2025-04-04 11:39:23 -04:00
* Driver Build : 85 da404 , I46ff5fc46f , 1606794520
* Date : 11 / 30 / 20
* Compiler Version : EV031 .31 .04 .01
* Driver Branch : promo490_3_Google
* ` ` `
2025-04-04 16:00:25 +11:00
*
2025-04-02 17:29:29 +11:00
* \ param device a GPU context to query .
2025-04-03 22:00:01 +00:00
* \ returns a valid property ID on success or 0 on failure ; call
* SDL_GetError ( ) for more information .
2025-04-02 17:29:29 +11:00
*
2025-04-04 11:44:14 -04:00
* \ threadsafety It is safe to call this function from any thread .
*
2025-04-02 17:29:29 +11:00
* \ since This function is available since SDL 3.4 .0 .
*/
2025-04-03 14:04:48 -07:00
extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGPUDeviceProperties ( SDL_GPUDevice * device ) ;
2025-04-02 17:29:29 +11:00
2025-04-03 14:04:48 -07:00
# define SDL_PROP_GPU_DEVICE_NAME_STRING "SDL.gpu.device.name"
# define SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING "SDL.gpu.device.driver_name"
# define SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING "SDL.gpu.device.driver_version"
# define SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING "SDL.gpu.device.driver_info"
2025-04-02 17:29:29 +11:00
2025-04-04 11:39:23 -04:00
2024-03-18 11:43:23 -07:00
/* State Creation */
/**
* Creates a pipeline object to be used in a compute workflow .
*
2024-09-05 16:59:20 +00:00
* Shader resource bindings must be authored to follow a particular order
* depending on the shader format .
2024-09-05 09:57:26 -07:00
*
* For SPIR - V shaders , use the following resource sets :
*
2024-09-11 02:20:48 +00:00
* - 0 : Sampled textures , followed by read - only storage textures , followed by
* read - only storage buffers
2024-12-23 23:58:24 +00:00
* - 1 : Read - write storage textures , followed by read - write storage buffers
2024-09-05 09:57:26 -07:00
* - 2 : Uniform buffers
*
2024-11-12 10:55:21 -08:00
* For DXBC and DXIL shaders , use the following register order :
2024-08-29 22:58:01 +00:00
*
2024-09-11 02:20:48 +00:00
* - ( t [ n ] , space0 ) : Sampled textures , followed by read - only storage textures ,
* followed by read - only storage buffers
2024-12-23 23:58:24 +00:00
* - ( u [ n ] , space1 ) : Read - write storage textures , followed by read - write
2024-09-05 16:59:20 +00:00
* storage buffers
2024-09-05 09:57:26 -07:00
* - ( b [ n ] , space2 ) : Uniform buffers
2024-08-29 22:58:01 +00:00
*
2024-09-05 09:57:26 -07:00
* For MSL / metallib , use the following order :
*
2024-12-23 23:58:24 +00:00
* - [ [ buffer ] ] : Uniform buffers , followed by read - only storage buffers ,
* followed by read - write storage buffers
2024-09-11 02:20:48 +00:00
* - [ [ texture ] ] : Sampled textures , followed by read - only storage textures ,
2024-12-23 23:58:24 +00:00
* followed by read - write storage textures
2024-08-29 22:58:01 +00:00
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING ` : a name that can be
* displayed in debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 23:39:48 +00:00
* \ param createinfo a struct describing the state of the compute pipeline to
* create .
2024-09-27 07:30:57 +00:00
* \ returns a compute pipeline object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_BindGPUComputePipeline
* \ sa SDL_ReleaseGPUComputePipeline
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUComputePipeline * SDLCALL SDL_CreateGPUComputePipeline (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUComputePipelineCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING "SDL.gpu.computepipeline.create.name"
2024-03-18 11:43:23 -07:00
/**
* Creates a pipeline object to be used in a graphics workflow .
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING ` : a name that can be
* displayed in debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 23:39:48 +00:00
* \ param createinfo a struct describing the state of the graphics pipeline to
* create .
2024-09-27 07:30:57 +00:00
* \ returns a graphics pipeline object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_CreateGPUShader
* \ sa SDL_BindGPUGraphicsPipeline
* \ sa SDL_ReleaseGPUGraphicsPipeline
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUGraphicsPipeline * SDLCALL SDL_CreateGPUGraphicsPipeline (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUGraphicsPipelineCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING "SDL.gpu.graphicspipeline.create.name"
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Creates a sampler object to be used when binding textures in a graphics
* workflow .
2024-03-18 11:43:23 -07:00
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING ` : a name that can be displayed
* in debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 18:38:23 -05:00
* \ param createinfo a struct describing the state of the sampler to create .
2024-09-27 07:30:57 +00:00
* \ returns a sampler object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_BindGPUVertexSamplers
* \ sa SDL_BindGPUFragmentSamplers
2024-11-21 17:43:08 +01:00
* \ sa SDL_ReleaseGPUSampler
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUSampler * SDLCALL SDL_CreateGPUSampler (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUSamplerCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING "SDL.gpu.sampler.create.name"
2024-03-18 11:43:23 -07:00
/**
* Creates a shader to be used when creating a graphics pipeline .
*
2024-09-05 16:59:20 +00:00
* Shader resource bindings must be authored to follow a particular order
* depending on the shader format .
2024-09-05 09:57:26 -07:00
*
* For SPIR - V shaders , use the following resource sets :
*
* For vertex shaders :
*
2024-09-05 16:59:20 +00:00
* - 0 : Sampled textures , followed by storage textures , followed by storage
* buffers
2024-09-05 09:57:26 -07:00
* - 1 : Uniform buffers
*
* For fragment shaders :
*
2024-09-05 16:59:20 +00:00
* - 2 : Sampled textures , followed by storage textures , followed by storage
* buffers
2024-09-05 09:57:26 -07:00
* - 3 : Uniform buffers
*
2024-11-12 10:55:21 -08:00
* For DXBC and DXIL shaders , use the following register order :
2024-09-05 09:57:26 -07:00
*
* For vertex shaders :
*
2024-09-05 16:59:20 +00:00
* - ( t [ n ] , space0 ) : Sampled textures , followed by storage textures , followed
* by storage buffers
* - ( s [ n ] , space0 ) : Samplers with indices corresponding to the sampled
* textures
2024-09-05 09:57:26 -07:00
* - ( b [ n ] , space1 ) : Uniform buffers
*
* For pixel shaders :
*
2024-09-05 16:59:20 +00:00
* - ( t [ n ] , space2 ) : Sampled textures , followed by storage textures , followed
* by storage buffers
* - ( s [ n ] , space2 ) : Samplers with indices corresponding to the sampled
* textures
2024-09-05 09:57:26 -07:00
* - ( b [ n ] , space3 ) : Uniform buffers
*
* For MSL / metallib , use the following order :
*
* - [ [ texture ] ] : Sampled textures , followed by storage textures
* - [ [ sampler ] ] : Samplers with indices corresponding to the sampled textures
2024-09-05 16:59:20 +00:00
* - [ [ buffer ] ] : Uniform buffers , followed by storage buffers . Vertex buffer 0
2024-09-15 20:17:43 -05:00
* is bound at [ [ buffer ( 14 ) ] ] , vertex buffer 1 at [ [ buffer ( 15 ) ] ] , and so on .
2024-09-05 16:59:20 +00:00
* Rather than manually authoring vertex buffer indices , use the
* [ [ stage_in ] ] attribute which will automatically use the vertex input
2024-11-21 17:43:08 +01:00
* information from the SDL_GPUGraphicsPipeline .
2024-08-29 22:58:01 +00:00
*
2024-12-20 00:35:23 +00:00
* Shader semantics other than system - value semantics do not matter in D3D12
* and for ease of use the SDL implementation assumes that non system - value
* semantics will all be TEXCOORD . If you are using HLSL as the shader source
* language , your vertex semantics should start at TEXCOORD0 and increment
* like so : TEXCOORD1 , TEXCOORD2 , etc . If you wish to change the semantic
* prefix to something other than TEXCOORD you can use
2024-12-19 18:54:59 +00:00
* SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with
* SDL_CreateGPUDeviceWithProperties ( ) .
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_SHADER_CREATE_NAME_STRING ` : a name that can be displayed in
* debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 18:38:23 -05:00
* \ param createinfo a struct describing the state of the shader to create .
2024-09-27 07:30:57 +00:00
* \ returns a shader object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_CreateGPUGraphicsPipeline
* \ sa SDL_ReleaseGPUShader
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUShader * SDLCALL SDL_CreateGPUShader (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUShaderCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_SHADER_CREATE_NAME_STRING "SDL.gpu.shader.create.name"
2024-03-18 11:43:23 -07:00
/**
* Creates a texture object to be used in graphics or compute workflows .
*
2024-08-29 22:58:01 +00:00
* The contents of this texture are undefined until data is written to the
2025-07-17 07:05:50 +00:00
* texture , either via SDL_UploadToGPUTexture or by performing a render or
* compute pass with this texture as a target .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* Note that certain combinations of usage flags are invalid . For example , a
* texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* If you request a sample count higher than the hardware supports , the
* implementation will automatically fall back to the highest available sample
* count .
2024-03-18 11:43:23 -07:00
*
2024-12-22 01:57:07 -05:00
* There are optional properties that can be provided through
* SDL_GPUTextureCreateInfo ' s ` props ` . These are the supported properties :
*
2025-01-13 17:06:35 -08:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT ` : ( Direct3D 12 only ) if
2024-12-22 07:09:56 +00:00
* the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET , clear the texture
* to a color with this red intensity . Defaults to zero .
2025-01-13 17:06:35 -08:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT ` : ( Direct3D 12 only ) if
2024-12-22 07:09:56 +00:00
* the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET , clear the texture
* to a color with this green intensity . Defaults to zero .
2025-01-13 17:06:35 -08:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT ` : ( Direct3D 12 only ) if
2024-12-22 07:09:56 +00:00
* the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET , clear the texture
* to a color with this blue intensity . Defaults to zero .
2025-01-13 17:06:35 -08:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT ` : ( Direct3D 12 only ) if
2024-12-22 07:09:56 +00:00
* the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET , clear the texture
* to a color with this alpha intensity . Defaults to zero .
2025-01-13 17:06:35 -08:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT ` : ( Direct3D 12 only )
2024-12-22 01:57:07 -05:00
* if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET , clear
* the texture to a depth of this value . Defaults to zero .
2025-04-22 10:27:27 -07:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER ` : ( Direct3D 12
2024-12-22 07:09:56 +00:00
* only ) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET ,
2025-04-22 10:27:27 -07:00
* clear the texture to a stencil of this Uint8 value . Defaults to zero .
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING ` : a name that can be displayed
* in debugging tools .
2024-12-22 01:57:07 -05:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 18:38:23 -05:00
* \ param createinfo a struct describing the state of the texture to create .
2024-09-27 07:30:57 +00:00
* \ returns a texture object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUTexture
2025-07-17 07:05:50 +00:00
* \ sa SDL_BeginGPURenderPass
* \ sa SDL_BeginGPUComputePass
2024-08-29 16:08:10 -07:00
* \ sa SDL_BindGPUVertexSamplers
* \ sa SDL_BindGPUVertexStorageTextures
* \ sa SDL_BindGPUFragmentSamplers
* \ sa SDL_BindGPUFragmentStorageTextures
* \ sa SDL_BindGPUComputeStorageTextures
2024-08-30 15:31:10 -07:00
* \ sa SDL_BlitGPUTexture
2024-08-29 16:08:10 -07:00
* \ sa SDL_ReleaseGPUTexture
2024-08-30 15:31:10 -07:00
* \ sa SDL_GPUTextureSupportsFormat
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUTexture * SDLCALL SDL_CreateGPUTexture (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUTextureCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-04-22 10:27:27 -07:00
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT "SDL.gpu.texture.create.d3d12.clear.r"
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT "SDL.gpu.texture.create.d3d12.clear.g"
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT "SDL.gpu.texture.create.d3d12.clear.b"
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT "SDL.gpu.texture.create.d3d12.clear.a"
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.texture.create.d3d12.clear.depth"
# define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER "SDL.gpu.texture.create.d3d12.clear.stencil"
# define SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING "SDL.gpu.texture.create.name"
2024-12-22 01:57:07 -05:00
2024-03-18 11:43:23 -07:00
/**
* Creates a buffer object to be used in graphics or compute workflows .
*
2024-08-29 22:58:01 +00:00
* The contents of this buffer are undefined until data is written to the
* buffer .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* Note that certain combinations of usage flags are invalid . For example , a
* buffer cannot have both the VERTEX and INDEX flags .
2024-03-18 11:43:23 -07:00
*
2025-01-21 23:08:39 +00:00
* If you use a STORAGE flag , the data in the buffer must respect std140
* layout conventions . In practical terms this means you must ensure that vec3
* and vec4 fields are 16 - byte aligned .
2025-01-21 15:07:34 -08:00
*
2024-12-23 05:32:13 +00:00
* For better understanding of underlying concepts and memory management with
* SDL GPU API , you may refer
* [ this blog post ] ( https : //moonside.games/posts/sdl-gpu-concepts-cycling/)
* .
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING ` : a name that can be displayed in
* debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 18:38:23 -05:00
* \ param createinfo a struct describing the state of the buffer to create .
2024-09-27 07:30:57 +00:00
* \ returns a buffer object on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_UploadToGPUBuffer
2024-09-04 18:24:11 -07:00
* \ sa SDL_DownloadFromGPUBuffer
* \ sa SDL_CopyGPUBufferToBuffer
2024-08-29 16:08:10 -07:00
* \ sa SDL_BindGPUVertexBuffers
* \ sa SDL_BindGPUIndexBuffer
* \ sa SDL_BindGPUVertexStorageBuffers
* \ sa SDL_BindGPUFragmentStorageBuffers
2024-09-04 18:24:11 -07:00
* \ sa SDL_DrawGPUPrimitivesIndirect
* \ sa SDL_DrawGPUIndexedPrimitivesIndirect
2024-08-29 16:08:10 -07:00
* \ sa SDL_BindGPUComputeStorageBuffers
2024-09-04 18:24:11 -07:00
* \ sa SDL_DispatchGPUComputeIndirect
2024-08-29 16:08:10 -07:00
* \ sa SDL_ReleaseGPUBuffer
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUBuffer * SDLCALL SDL_CreateGPUBuffer (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUBufferCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING "SDL.gpu.buffer.create.name"
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Creates a transfer buffer to be used when uploading to or downloading from
* graphics resources .
2024-03-18 11:43:23 -07:00
*
2024-10-23 16:37:46 +00:00
* Download buffers can be particularly expensive to create , so it is good
* practice to reuse them if data will be downloaded regularly .
2024-10-23 09:37:06 -07:00
*
2025-01-14 01:30:53 +00:00
* There are optional properties that can be provided through ` props ` . These
* are the supported properties :
2025-01-13 17:29:08 -08:00
*
2025-01-14 01:30:53 +00:00
* - ` SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING ` : a name that can be
* displayed in debugging tools .
2025-01-13 17:29:08 -08:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
2024-09-06 23:39:48 +00:00
* \ param createinfo a struct describing the state of the transfer buffer to
* create .
2024-09-27 07:30:57 +00:00
* \ returns a transfer buffer on success , or NULL on failure ; call
* SDL_GetError ( ) for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_UploadToGPUBuffer
* \ sa SDL_DownloadFromGPUBuffer
* \ sa SDL_UploadToGPUTexture
* \ sa SDL_DownloadFromGPUTexture
* \ sa SDL_ReleaseGPUTransferBuffer
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUTransferBuffer * SDLCALL SDL_CreateGPUTransferBuffer (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
const SDL_GPUTransferBufferCreateInfo * createinfo ) ;
2024-03-18 11:43:23 -07:00
2025-01-13 17:29:08 -08:00
# define SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING "SDL.gpu.transferbuffer.create.name"
2024-03-18 11:43:23 -07:00
/* Debug Naming */
/**
2024-08-29 22:58:01 +00:00
* Sets an arbitrary string constant to label a buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-14 01:30:53 +00:00
* You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with
* SDL_CreateGPUBuffer instead of this function to avoid thread safety issues .
2024-08-29 22:58:01 +00:00
*
* \ param device a GPU Context .
* \ param buffer a buffer to attach the name to .
* \ param text a UTF - 8 string constant to mark as the name of the buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-14 01:30:53 +00:00
* \ threadsafety This function is not thread safe , you must make sure the
* buffer is not simultaneously used by any other thread .
2025-01-12 14:22:26 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-13 17:29:08 -08:00
*
* \ sa SDL_CreateGPUBuffer
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName (
SDL_GPUDevice * device ,
SDL_GPUBuffer * buffer ,
2024-03-18 11:43:23 -07:00
const char * text ) ;
/**
2024-08-29 22:58:01 +00:00
* Sets an arbitrary string constant to label a texture .
*
2025-01-14 01:30:53 +00:00
* You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with
* SDL_CreateGPUTexture instead of this function to avoid thread safety
* issues .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU Context .
* \ param texture a texture to attach the name to .
* \ param text a UTF - 8 string constant to mark as the name of the texture .
2024-03-18 11:43:23 -07:00
*
2025-01-14 01:30:53 +00:00
* \ threadsafety This function is not thread safe , you must make sure the
* texture is not simultaneously used by any other thread .
2025-01-12 14:22:26 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-13 17:29:08 -08:00
*
* \ sa SDL_CreateGPUTexture
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName (
SDL_GPUDevice * device ,
SDL_GPUTexture * texture ,
2024-03-18 11:43:23 -07:00
const char * text ) ;
/**
* Inserts an arbitrary string label into the command buffer callstream .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* Useful for debugging .
*
2025-12-05 17:42:23 +00:00
* On Direct3D 12 , using SDL_InsertGPUDebugLabel requires
* WinPixEventRuntime . dll to be in your PATH or in the same directory as your
* executable . See
* [ here ] ( https : //devblogs.microsoft.com/pix/winpixeventruntime/)
2025-12-03 20:01:41 +00:00
* for instructions on how to obtain it .
2025-12-03 13:03:56 +01:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-08-29 22:58:01 +00:00
* \ param text a UTF - 8 string constant to insert as the label .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-03-18 11:43:23 -07:00
const char * text ) ;
/**
2025-08-07 11:58:25 +01:00
* Begins a debug group with an arbitrary name .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* Used for denoting groups of calls when viewing the command buffer
* callstream in a graphics debugging tool .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* Each call to SDL_PushGPUDebugGroup must have a corresponding call to
* SDL_PopGPUDebugGroup .
2024-03-18 11:43:23 -07:00
*
2025-12-05 18:40:57 +01:00
* On Direct3D 12 , using SDL_PushGPUDebugGroup requires WinPixEventRuntime . dll
2025-12-05 17:42:23 +00:00
* to be in your PATH or in the same directory as your executable . See
* [ here ] ( https : //devblogs.microsoft.com/pix/winpixeventruntime/)
2025-12-03 20:01:41 +00:00
* for instructions on how to obtain it .
2025-12-03 13:03:56 +01:00
*
2024-08-29 22:58:01 +00:00
* On some backends ( e . g . Metal ) , pushing a debug group during a
* render / blit / compute pass will create a group that is scoped to the native
* pass rather than the command buffer . For best results , if you push a debug
* group during a pass , always pop it in the same pass .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-08-29 22:58:01 +00:00
* \ param name a UTF - 8 string constant that names the group .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_PopGPUDebugGroup
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-03-18 11:43:23 -07:00
const char * name ) ;
/**
* Ends the most - recently pushed debug group .
*
2025-12-05 18:40:57 +01:00
* On Direct3D 12 , using SDL_PopGPUDebugGroup requires WinPixEventRuntime . dll
2025-12-05 17:42:23 +00:00
* to be in your PATH or in the same directory as your executable . See
* [ here ] ( https : //devblogs.microsoft.com/pix/winpixeventruntime/)
2025-12-03 20:01:41 +00:00
* for instructions on how to obtain it .
2025-12-03 13:03:56 +01:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_PushGPUDebugGroup
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ) ;
2024-03-18 11:43:23 -07:00
/* Disposal */
/**
* Frees the given texture as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the texture after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param texture a texture to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture (
SDL_GPUDevice * device ,
SDL_GPUTexture * texture ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given sampler as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-09-07 23:13:46 +00:00
* You must not reference the sampler after calling this function .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param sampler a sampler to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler (
SDL_GPUDevice * device ,
SDL_GPUSampler * sampler ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given buffer as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the buffer after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param buffer a buffer to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer (
SDL_GPUDevice * device ,
SDL_GPUBuffer * buffer ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given transfer buffer as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the transfer buffer after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param transfer_buffer a transfer buffer to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer (
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
SDL_GPUTransferBuffer * transfer_buffer ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given compute pipeline as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the compute pipeline after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param compute_pipeline a compute pipeline to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline (
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
SDL_GPUComputePipeline * compute_pipeline ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given shader as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the shader after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param shader a shader to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader (
SDL_GPUDevice * device ,
SDL_GPUShader * shader ) ;
2024-03-18 11:43:23 -07:00
/**
* Frees the given graphics pipeline as soon as it is safe to do so .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not reference the graphics pipeline after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param graphics_pipeline a graphics pipeline to be destroyed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline (
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
SDL_GPUGraphicsPipeline * graphics_pipeline ) ;
2024-03-18 11:43:23 -07:00
/**
* Acquire a command buffer .
*
2024-08-29 22:58:01 +00:00
* This command buffer is managed by the implementation and should not be
* freed by the user . The command buffer may only be used on the thread it was
* acquired on . The command buffer should be submitted on the thread it was
* acquired on .
*
2024-12-26 12:46:42 +11:00
* It is valid to acquire multiple command buffers on the same thread at once .
* In fact a common design pattern is to acquire two command buffers per frame
* where one is dedicated to render and compute passes and the other is
* dedicated to copy passes and other preparatory work such as generating
* mipmaps . Interleaving commands between the two command buffers reduces the
* total amount of passes overall which improves rendering performance .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-27 07:30:57 +00:00
* \ returns a command buffer , or NULL on failure ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBuffer
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUCommandBuffer * SDLCALL SDL_AcquireGPUCommandBuffer (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
2024-12-26 12:46:42 +11:00
/* Uniform Data */
2024-03-18 11:43:23 -07:00
/**
* Pushes data to a vertex uniform slot on the command buffer .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* Subsequent draw calls will use this uniform data .
*
2025-01-21 23:08:39 +00:00
* The data being pushed must respect std140 layout conventions . In practical
* terms this means you must ensure that vec3 and vec4 fields are 16 - byte
* aligned .
2025-01-21 15:07:34 -08:00
*
2025-05-05 15:21:20 +00:00
* For detailed information about accessing uniform data from a shader , please
* refer to SDL_CreateGPUShader .
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
* \ param slot_index the vertex uniform slot to push data to .
2024-08-29 22:58:01 +00:00
* \ param data client data to write .
2024-09-06 18:38:23 -05:00
* \ param length the length of the data to write .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
Uint32 slot_index ,
2024-03-18 11:43:23 -07:00
const void * data ,
2024-09-06 18:38:23 -05:00
Uint32 length ) ;
2024-03-18 11:43:23 -07:00
/**
* Pushes data to a fragment uniform slot on the command buffer .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* Subsequent draw calls will use this uniform data .
*
2025-01-21 23:04:33 +00:00
* The data being pushed must respect std140 layout conventions . In practical
* terms this means you must ensure that vec3 and vec4 fields are 16 - byte
* aligned .
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
* \ param slot_index the fragment uniform slot to push data to .
2024-08-29 22:58:01 +00:00
* \ param data client data to write .
2024-09-06 18:38:23 -05:00
* \ param length the length of the data to write .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
Uint32 slot_index ,
2024-03-18 11:43:23 -07:00
const void * data ,
2024-09-06 18:38:23 -05:00
Uint32 length ) ;
2024-03-18 11:43:23 -07:00
/**
* Pushes data to a uniform slot on the command buffer .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* Subsequent draw calls will use this uniform data .
2025-01-21 23:08:39 +00:00
*
* The data being pushed must respect std140 layout conventions . In practical
* terms this means you must ensure that vec3 and vec4 fields are 16 - byte
* aligned .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
* \ param slot_index the uniform slot to push data to .
2024-08-29 22:58:01 +00:00
* \ param data client data to write .
2024-09-06 18:38:23 -05:00
* \ param length the length of the data to write .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
Uint32 slot_index ,
2024-03-18 11:43:23 -07:00
const void * data ,
2024-09-06 18:38:23 -05:00
Uint32 length ) ;
2024-03-18 11:43:23 -07:00
/* Graphics State */
/**
* Begins a render pass on a command buffer .
2024-08-29 22:58:01 +00:00
*
* A render pass consists of a set of texture subresources ( or depth slices in
* the 3 D texture case ) which will be rendered to during the render pass ,
* along with corresponding clear values and load / store operations . All
* operations related to graphics pipelines must take place inside of a render
* pass . A default viewport and scissor state are automatically set when this
* is called . You cannot begin another render pass , or begin a compute pass or
* copy pass until you have ended the render pass .
*
2025-07-17 07:20:27 +00:00
* Using SDL_GPU_LOADOP_LOAD before any contents have been written to the
* texture subresource will result in undefined behavior . SDL_GPU_LOADOP_CLEAR
* will set the contents of the texture subresource to a single value before
* any rendering is performed . It ' s fine to do an empty render pass using
* SDL_GPU_STOREOP_STORE to clear a texture , but in general it ' s better to
* think of clearing not as an independent operation but as something that ' s
* done as the beginning of a render pass .
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
* \ param color_target_infos an array of texture subresources with
2024-09-06 23:39:48 +00:00
* corresponding clear values and load / store ops .
2024-09-06 18:38:23 -05:00
* \ param num_color_targets the number of color targets in the
2024-09-06 23:39:48 +00:00
* color_target_infos array .
2024-09-06 18:38:23 -05:00
* \ param depth_stencil_target_info a texture subresource with corresponding
2024-09-06 23:39:48 +00:00
* clear value and load / store ops , may be
* NULL .
2024-08-29 22:58:01 +00:00
* \ returns a render pass handle .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_EndGPURenderPass
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPURenderPass * SDLCALL SDL_BeginGPURenderPass (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
const SDL_GPUColorTargetInfo * color_target_infos ,
Uint32 num_color_targets ,
const SDL_GPUDepthStencilTargetInfo * depth_stencil_target_info ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds a graphics pipeline on a render pass to be used in rendering .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* A graphics pipeline must be bound before making any draw calls .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param graphics_pipeline the graphics pipeline to bind .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
SDL_GPUGraphicsPipeline * graphics_pipeline ) ;
2024-03-18 11:43:23 -07:00
/**
* Sets the current viewport state on a command buffer .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-08-29 22:58:01 +00:00
* \ param viewport the viewport to set .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUViewport * viewport ) ;
2024-03-18 11:43:23 -07:00
/**
* Sets the current scissor state on a command buffer .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-08-29 22:58:01 +00:00
* \ param scissor the scissor area to set .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-09-04 13:53:41 -07:00
const SDL_Rect * scissor ) ;
2024-03-18 11:43:23 -07:00
2024-09-05 17:41:23 -05:00
/**
* Sets the current blend constants on a command buffer .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param blend_constants the blend constant color .
2024-09-05 17:41:23 -05:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-05 17:41:23 -05:00
*
* \ sa SDL_GPU_BLENDFACTOR_CONSTANT_COLOR
* \ sa SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR
*/
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBlendConstants (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
SDL_FColor blend_constants ) ;
2024-09-05 17:41:23 -05:00
/**
* Sets the current stencil reference value on a command buffer .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-09-05 17:41:23 -05:00
* \ param reference the stencil reference value to set .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-09-05 17:41:23 -05:00
*/
extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-09-05 17:41:23 -05:00
Uint8 reference ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Binds vertex buffers on a command buffer for use with subsequent draw
* calls .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-09-12 18:02:39 -05:00
* \ param first_slot the vertex buffer slot to begin binding from .
2024-09-06 18:38:23 -05:00
* \ param bindings an array of SDL_GPUBufferBinding structs containing vertex
2024-09-06 23:39:48 +00:00
* buffers and offset values .
2024-09-06 18:38:23 -05:00
* \ param num_bindings the number of bindings in the bindings array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-09-12 18:02:39 -05:00
Uint32 first_slot ,
2024-09-06 18:38:23 -05:00
const SDL_GPUBufferBinding * bindings ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Binds an index buffer on a command buffer for use with subsequent draw
* calls .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-09-06 23:39:48 +00:00
* \ param binding a pointer to a struct containing an index buffer and offset .
2024-09-06 18:38:23 -05:00
* \ param index_element_size whether the index values in the buffer are 16 - or
2024-09-06 23:39:48 +00:00
* 32 - bit .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
const SDL_GPUBufferBinding * binding ,
SDL_GPUIndexElementSize index_element_size ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds texture - sampler pairs for use on the vertex shader .
2024-08-29 22:58:01 +00:00
*
2024-09-02 17:19:43 -05:00
* The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER .
2024-03-18 11:43:23 -07:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the vertex sampler slot to begin binding from .
2024-09-06 23:39:48 +00:00
* \ param texture_sampler_bindings an array of texture - sampler binding
* structs .
2024-09-06 18:38:23 -05:00
* \ param num_bindings the number of texture - sampler pairs to bind from the
2024-08-29 22:58:01 +00:00
* array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
const SDL_GPUTextureSamplerBinding * texture_sampler_bindings ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage textures for use on the vertex shader .
*
2024-08-29 22:58:01 +00:00
* These textures must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ .
2024-03-18 11:43:23 -07:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the vertex storage texture slot to begin binding from .
* \ param storage_textures an array of storage textures .
* \ param num_bindings the number of storage texture to bind from the array .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
SDL_GPUTexture * const * storage_textures ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage buffers for use on the vertex shader .
*
2024-08-29 22:58:01 +00:00
* These buffers must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ .
2024-08-29 22:58:01 +00:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the vertex storage buffer slot to begin binding from .
* \ param storage_buffers an array of buffers .
* \ param num_bindings the number of buffers to bind from the array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
SDL_GPUBuffer * const * storage_buffers ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds texture - sampler pairs for use on the fragment shader .
2024-08-29 22:58:01 +00:00
*
2024-09-02 17:19:43 -05:00
* The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER .
2024-03-18 11:43:23 -07:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the fragment sampler slot to begin binding from .
2024-09-06 23:39:48 +00:00
* \ param texture_sampler_bindings an array of texture - sampler binding
* structs .
2024-09-06 18:38:23 -05:00
* \ param num_bindings the number of texture - sampler pairs to bind from the
2024-08-29 22:58:01 +00:00
* array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
const SDL_GPUTextureSamplerBinding * texture_sampler_bindings ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage textures for use on the fragment shader .
*
2024-08-29 22:58:01 +00:00
* These textures must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ .
2024-08-29 22:58:01 +00:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the fragment storage texture slot to begin binding from .
* \ param storage_textures an array of storage textures .
* \ param num_bindings the number of storage textures to bind from the array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
SDL_GPUTexture * const * storage_textures ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage buffers for use on the fragment shader .
*
2024-08-29 22:58:01 +00:00
* These buffers must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ .
2024-03-18 11:43:23 -07:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param first_slot the fragment storage buffer slot to begin binding from .
* \ param storage_buffers an array of storage buffers .
* \ param num_bindings the number of storage buffers to bind from the array .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 first_slot ,
SDL_GPUBuffer * const * storage_buffers ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/* Drawing */
/**
2024-08-29 22:58:01 +00:00
* Draws data using bound graphics state with an index buffer and instancing
* enabled .
*
2024-03-18 11:43:23 -07:00
* You must not call this function before binding a graphics pipeline .
*
2024-09-06 18:38:23 -05:00
* Note that the ` first_vertex ` and ` first_instance ` parameters are NOT
2024-08-29 22:58:01 +00:00
* compatible with built - in vertex / instance ID variables in shaders ( for
2024-12-24 14:52:32 -05:00
* example , SV_VertexID ) ; GPU APIs and shader languages do not define these
2024-12-31 22:56:38 +00:00
* built - in variables consistently , so if your shader depends on them , the
* only way to keep behavior consistent and portable is to always pass 0 for
* the correlating parameter in the draw calls .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-09-07 08:29:14 -07:00
* \ param num_indices the number of indices to draw per instance .
2024-09-06 18:38:23 -05:00
* \ param num_instances the number of instances to draw .
* \ param first_index the starting index within the index buffer .
* \ param vertex_offset value added to vertex index before indexing into the
2024-09-06 23:39:48 +00:00
* vertex buffer .
2024-09-06 18:38:23 -05:00
* \ param first_instance the ID of the first instance to draw .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 num_indices ,
Uint32 num_instances ,
Uint32 first_index ,
Sint32 vertex_offset ,
Uint32 first_instance ) ;
2024-03-18 11:43:23 -07:00
/**
* Draws data using bound graphics state .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not call this function before binding a graphics pipeline .
*
2024-09-06 18:38:23 -05:00
* Note that the ` first_vertex ` and ` first_instance ` parameters are NOT
2024-08-29 22:58:01 +00:00
* compatible with built - in vertex / instance ID variables in shaders ( for
2024-12-24 14:52:32 -05:00
* example , SV_VertexID ) ; GPU APIs and shader languages do not define these
2024-12-31 22:56:38 +00:00
* built - in variables consistently , so if your shader depends on them , the
* only way to keep behavior consistent and portable is to always pass 0 for
* the correlating parameter in the draw calls .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
* \ param num_vertices the number of vertices to draw .
* \ param num_instances the number of instances that will be drawn .
* \ param first_vertex the index of the first vertex to draw .
* \ param first_instance the ID of the first instance to draw .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
Uint32 num_vertices ,
Uint32 num_instances ,
Uint32 first_vertex ,
Uint32 first_instance ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Draws data using bound graphics state and with draw parameters set from a
* buffer .
*
2024-09-12 06:31:07 +00:00
* The buffer must consist of tightly - packed draw parameter sets that each
2024-09-12 09:10:20 -05:00
* match the layout of SDL_GPUIndirectDrawCommand . You must not call this
2024-09-12 06:31:07 +00:00
* function before binding a graphics pipeline .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-08-29 22:58:01 +00:00
* \ param buffer a buffer containing draw parameters .
2024-09-06 18:38:23 -05:00
* \ param offset the offset to start reading from the draw buffer .
2024-09-06 23:39:48 +00:00
* \ param draw_count the number of draw parameter sets that should be read
* from the draw buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-08-29 16:08:10 -07:00
SDL_GPUBuffer * buffer ,
2024-09-06 18:38:23 -05:00
Uint32 offset ,
2024-09-12 01:30:14 -05:00
Uint32 draw_count ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Draws data using bound graphics state with an index buffer enabled and with
* draw parameters set from a buffer .
*
2024-09-12 06:31:07 +00:00
* The buffer must consist of tightly - packed draw parameter sets that each
2024-09-12 14:11:07 +00:00
* match the layout of SDL_GPUIndexedIndirectDrawCommand . You must not call
* this function before binding a graphics pipeline .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-08-29 22:58:01 +00:00
* \ param buffer a buffer containing draw parameters .
2024-09-06 18:38:23 -05:00
* \ param offset the offset to start reading from the draw buffer .
2024-09-06 23:39:48 +00:00
* \ param draw_count the number of draw parameter sets that should be read
* from the draw buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ,
2024-08-29 16:08:10 -07:00
SDL_GPUBuffer * buffer ,
2024-09-06 18:38:23 -05:00
Uint32 offset ,
2024-09-12 01:30:14 -05:00
Uint32 draw_count ) ;
2024-03-18 11:43:23 -07:00
/**
* Ends the given render pass .
*
2024-08-29 22:58:01 +00:00
* All bound graphics state on the render pass command buffer is unset . The
* render pass handle is now invalid .
*
2024-09-06 18:38:23 -05:00
* \ param render_pass a render pass handle .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass (
2024-09-06 18:38:23 -05:00
SDL_GPURenderPass * render_pass ) ;
2024-03-18 11:43:23 -07:00
/* Compute Pass */
/**
* Begins a compute pass on a command buffer .
*
2024-08-29 22:58:01 +00:00
* A compute pass is defined by a set of texture subresources and buffers that
2024-09-27 12:49:37 -07:00
* may be written to by compute pipelines . These textures and buffers must
2024-09-27 19:50:13 +00:00
* have been created with the COMPUTE_STORAGE_WRITE bit or the
* COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE bit . If you do not create a texture
* with COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE , you must not read from the
* texture in the compute pass . All operations related to compute pipelines
* must take place inside of a compute pass . You must not begin another
* compute pass , or a render pass or copy pass before ending the compute pass .
*
* A VERY IMPORTANT NOTE - Reads and writes in compute passes are NOT
* implicitly synchronized . This means you may cause data races by both
* reading and writing a resource region in a compute pass , or by writing
* multiple times to a resource region . If your compute work depends on
* reading the completed output from a previous dispatch , you MUST end the
* current compute pass and begin a new one before you can safely access the
* data . Otherwise you will receive unexpected results . Reading and writing a
* texture in the same compute pass is only supported by specific texture
* formats . Make sure you check the format support !
2024-08-29 22:58:01 +00:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-09-06 23:39:48 +00:00
* \ param storage_texture_bindings an array of writeable storage texture
* binding structs .
2024-09-06 18:38:23 -05:00
* \ param num_storage_texture_bindings the number of storage textures to bind
2024-09-06 23:39:48 +00:00
* from the array .
2024-09-06 18:38:23 -05:00
* \ param storage_buffer_bindings an array of writeable storage buffer binding
2024-09-06 23:39:48 +00:00
* structs .
* \ param num_storage_buffer_bindings the number of storage buffers to bind
* from the array .
2024-08-29 22:58:01 +00:00
* \ returns a compute pass handle .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_EndGPUComputePass
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUComputePass * SDLCALL SDL_BeginGPUComputePass (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-09-27 12:49:37 -07:00
const SDL_GPUStorageTextureReadWriteBinding * storage_texture_bindings ,
2024-09-06 18:38:23 -05:00
Uint32 num_storage_texture_bindings ,
2024-09-27 12:49:37 -07:00
const SDL_GPUStorageBufferReadWriteBinding * storage_buffer_bindings ,
2024-09-06 18:38:23 -05:00
Uint32 num_storage_buffer_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds a compute pipeline on a command buffer for use in compute dispatch .
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
* \ param compute_pipeline a compute pipeline to bind .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ,
SDL_GPUComputePipeline * compute_pipeline ) ;
2024-03-18 11:43:23 -07:00
2024-09-10 19:20:14 -07:00
/**
* Binds texture - sampler pairs for use on the compute shader .
*
* The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER .
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-10 19:20:14 -07:00
* \ param compute_pass a compute pass handle .
* \ param first_slot the compute sampler slot to begin binding from .
2024-09-11 02:20:48 +00:00
* \ param texture_sampler_bindings an array of texture - sampler binding
* structs .
* \ param num_bindings the number of texture - sampler bindings to bind from the
* array .
2024-09-10 19:20:14 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-09-10 19:20:14 -07:00
*/
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers (
SDL_GPUComputePass * compute_pass ,
Uint32 first_slot ,
const SDL_GPUTextureSamplerBinding * texture_sampler_bindings ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage textures as readonly for use on the compute pipeline .
*
2024-08-29 22:58:01 +00:00
* These textures must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ .
2024-08-29 22:58:01 +00:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
* \ param first_slot the compute storage texture slot to begin binding from .
* \ param storage_textures an array of storage textures .
* \ param num_bindings the number of storage textures to bind from the array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ,
Uint32 first_slot ,
SDL_GPUTexture * const * storage_textures ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Binds storage buffers as readonly for use on the compute pipeline .
*
2024-08-29 22:58:01 +00:00
* These buffers must have been created with
2024-09-02 17:19:43 -05:00
* SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ .
2024-08-29 22:58:01 +00:00
*
2025-01-24 20:06:31 +00:00
* Be sure your shader is set up according to the requirements documented in
* SDL_CreateGPUShader ( ) .
2025-01-24 12:04:00 -08:00
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
* \ param first_slot the compute storage buffer slot to begin binding from .
* \ param storage_buffers an array of storage buffer binding structs .
* \ param num_bindings the number of storage buffers to bind from the array .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-01-24 12:04:00 -08:00
*
* \ sa SDL_CreateGPUShader
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ,
Uint32 first_slot ,
SDL_GPUBuffer * const * storage_buffers ,
Uint32 num_bindings ) ;
2024-03-18 11:43:23 -07:00
/**
* Dispatches compute work .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* You must not call this function before binding a compute pipeline .
*
2024-08-29 22:58:01 +00:00
* A VERY IMPORTANT NOTE If you dispatch multiple times in a compute pass , and
* the dispatches write to the same resource region as each other , there is no
* guarantee of which order the writes will occur . If the write order matters ,
* you MUST end the compute pass and begin another one .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
* \ param groupcount_x number of local workgroups to dispatch in the X
2024-09-06 23:39:48 +00:00
* dimension .
2024-09-06 18:38:23 -05:00
* \ param groupcount_y number of local workgroups to dispatch in the Y
2024-09-06 23:39:48 +00:00
* dimension .
2024-09-06 18:38:23 -05:00
* \ param groupcount_z number of local workgroups to dispatch in the Z
2024-09-06 23:39:48 +00:00
* dimension .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ,
Uint32 groupcount_x ,
Uint32 groupcount_y ,
Uint32 groupcount_z ) ;
2024-03-18 11:43:23 -07:00
/**
* Dispatches compute work with parameters set from a buffer .
*
2024-09-12 06:31:07 +00:00
* The buffer layout should match the layout of
* SDL_GPUIndirectDispatchCommand . You must not call this function before
* binding a compute pipeline .
2024-08-29 22:58:01 +00:00
*
* A VERY IMPORTANT NOTE If you dispatch multiple times in a compute pass , and
* the dispatches write to the same resource region as each other , there is no
* guarantee of which order the writes will occur . If the write order matters ,
* you MUST end the compute pass and begin another one .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
2024-08-29 22:58:01 +00:00
* \ param buffer a buffer containing dispatch parameters .
2024-09-06 18:38:23 -05:00
* \ param offset the offset to start reading from the dispatch buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ,
2024-08-29 16:08:10 -07:00
SDL_GPUBuffer * buffer ,
2024-09-06 18:38:23 -05:00
Uint32 offset ) ;
2024-03-18 11:43:23 -07:00
/**
* Ends the current compute pass .
*
2024-08-29 22:58:01 +00:00
* All bound compute state on the command buffer is unset . The compute pass
* handle is now invalid .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param compute_pass a compute pass handle .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass (
2024-09-06 18:38:23 -05:00
SDL_GPUComputePass * compute_pass ) ;
2024-03-18 11:43:23 -07:00
/* TransferBuffer Data */
/**
* Maps a transfer buffer into application address space .
2024-08-29 22:58:01 +00:00
*
2025-01-23 23:20:22 +00:00
* You must unmap the transfer buffer before encoding upload commands . The
* memory is owned by the graphics driver - do NOT call SDL_free ( ) on the
* returned pointer .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param transfer_buffer a transfer buffer .
2024-09-18 15:33:11 +00:00
* \ param cycle if true , cycles the transfer buffer if it is already bound .
2024-09-27 07:30:57 +00:00
* \ returns the address of the mapped transfer buffer memory , or NULL on
* failure ; call SDL_GetError ( ) for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC void * SDLCALL SDL_MapGPUTransferBuffer (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
SDL_GPUTransferBuffer * transfer_buffer ,
2024-09-18 07:52:28 -07:00
bool cycle ) ;
2024-03-18 11:43:23 -07:00
/**
* Unmaps a previously mapped transfer buffer .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param transfer_buffer a previously mapped transfer buffer .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer (
SDL_GPUDevice * device ,
2024-09-06 18:38:23 -05:00
SDL_GPUTransferBuffer * transfer_buffer ) ;
2024-03-18 11:43:23 -07:00
/* Copy Pass */
/**
* Begins a copy pass on a command buffer .
*
2024-08-29 22:58:01 +00:00
* All operations related to copying to or from buffers or textures take place
* inside a copy pass . You must not begin another copy pass , or a render pass
* or compute pass before ending the copy pass .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-08-29 22:58:01 +00:00
* \ returns a copy pass handle .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2025-08-19 20:39:22 +00:00
*
* \ sa SDL_EndGPUCopyPass
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUCopyPass * SDLCALL SDL_BeginGPUCopyPass (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ) ;
2024-03-18 11:43:23 -07:00
/**
* Uploads data from a transfer buffer to a texture .
*
2024-08-29 22:58:01 +00:00
* The upload occurs on the GPU timeline . You may assume that the upload has
* finished in subsequent commands .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* You must align the data in the transfer buffer to a multiple of the texel
* size of the texture format .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source the source transfer buffer with image layout information .
* \ param destination the destination texture region .
2024-09-18 15:33:11 +00:00
* \ param cycle if true , cycles the texture if the texture is bound , otherwise
* overwrites the data .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUTextureTransferInfo * source ,
const SDL_GPUTextureRegion * destination ,
2024-09-18 07:52:28 -07:00
bool cycle ) ;
2024-03-18 11:43:23 -07:00
/**
* Uploads data from a transfer buffer to a buffer .
*
2024-08-29 22:58:01 +00:00
* The upload occurs on the GPU timeline . You may assume that the upload has
* finished in subsequent commands .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source the source transfer buffer with offset .
* \ param destination the destination buffer with offset and size .
2024-09-18 15:33:11 +00:00
* \ param cycle if true , cycles the buffer if it is already bound , otherwise
* overwrites the data .
2024-08-29 22:58:01 +00:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUTransferBufferLocation * source ,
const SDL_GPUBufferRegion * destination ,
2024-09-18 07:52:28 -07:00
bool cycle ) ;
2024-03-18 11:43:23 -07:00
/**
* Performs a texture - to - texture copy .
*
2024-08-29 22:58:01 +00:00
* This copy occurs on the GPU timeline . You may assume the copy has finished
* in subsequent commands .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source a source texture region .
* \ param destination a destination texture region .
* \ param w the width of the region to copy .
* \ param h the height of the region to copy .
* \ param d the depth of the region to copy .
2024-09-18 07:52:28 -07:00
* \ param cycle if true , cycles the destination texture if the destination
2024-08-29 22:58:01 +00:00
* texture is bound , otherwise overwrites the data .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUTextureLocation * source ,
const SDL_GPUTextureLocation * destination ,
2024-03-18 11:43:23 -07:00
Uint32 w ,
Uint32 h ,
Uint32 d ,
2024-09-18 07:52:28 -07:00
bool cycle ) ;
2024-03-18 11:43:23 -07:00
/**
* Performs a buffer - to - buffer copy .
*
2024-08-29 22:58:01 +00:00
* This copy occurs on the GPU timeline . You may assume the copy has finished
* in subsequent commands .
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source the buffer and offset to copy from .
* \ param destination the buffer and offset to copy to .
* \ param size the length of the buffer to copy .
2024-09-18 15:33:11 +00:00
* \ param cycle if true , cycles the destination buffer if it is already bound ,
* otherwise overwrites the data .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUBufferLocation * source ,
const SDL_GPUBufferLocation * destination ,
2024-03-18 11:43:23 -07:00
Uint32 size ,
2024-09-18 07:52:28 -07:00
bool cycle ) ;
2024-03-18 11:43:23 -07:00
/**
* Copies data from a texture to a transfer buffer on the GPU timeline .
*
2024-08-29 22:58:01 +00:00
* This data is not guaranteed to be copied until the command buffer fence is
* signaled .
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source the source texture region .
* \ param destination the destination transfer buffer with image layout
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUTextureRegion * source ,
const SDL_GPUTextureTransferInfo * destination ) ;
2024-03-18 11:43:23 -07:00
/**
* Copies data from a buffer to a transfer buffer on the GPU timeline .
*
2024-08-29 22:58:01 +00:00
* This data is not guaranteed to be copied until the command buffer fence is
* signaled .
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-08-29 22:58:01 +00:00
* \ param source the source buffer with offset and size .
* \ param destination the destination transfer buffer with offset .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ,
2024-09-04 13:53:41 -07:00
const SDL_GPUBufferRegion * source ,
const SDL_GPUTransferBufferLocation * destination ) ;
2024-03-18 11:43:23 -07:00
/**
* Ends the current copy pass .
*
2024-09-06 18:38:23 -05:00
* \ param copy_pass a copy pass handle .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass (
2024-09-06 18:38:23 -05:00
SDL_GPUCopyPass * copy_pass ) ;
2024-03-18 11:43:23 -07:00
/**
* Generates mipmaps for the given texture .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* This function must not be called inside of any pass .
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command_buffer .
2024-08-29 22:58:01 +00:00
* \ param texture a texture with more than 1 mip level .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-30 15:31:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-08-29 16:08:10 -07:00
SDL_GPUTexture * texture ) ;
2024-03-18 11:43:23 -07:00
/**
* Blits from a source texture region to a destination texture region .
*
2024-08-29 22:58:01 +00:00
* This function must not be called inside of any pass .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-09-09 10:19:52 -07:00
* \ param info the blit info struct containing the blit parameters .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-30 15:31:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-09-09 10:19:52 -07:00
const SDL_GPUBlitInfo * info ) ;
2024-03-18 11:43:23 -07:00
/* Submission/Presentation */
/**
* Determines whether a swapchain composition is supported by the window .
*
2024-08-29 22:58:01 +00:00
* The window must be claimed before calling this function .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window .
2024-09-06 18:38:23 -05:00
* \ param swapchain_composition the swapchain composition to check .
2024-09-27 00:30:18 -07:00
* \ returns true if supported , false if unsupported .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_ClaimWindowForGPUDevice
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ,
2024-09-06 18:38:23 -05:00
SDL_GPUSwapchainComposition swapchain_composition ) ;
2024-03-18 11:43:23 -07:00
/**
* Determines whether a presentation mode is supported by the window .
*
2024-08-29 22:58:01 +00:00
* The window must be claimed before calling this function .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window .
2024-09-06 18:38:23 -05:00
* \ param present_mode the presentation mode to check .
2024-09-27 00:30:18 -07:00
* \ returns true if supported , false if unsupported .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_ClaimWindowForGPUDevice
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUPresentMode (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ,
2024-09-06 18:38:23 -05:00
SDL_GPUPresentMode present_mode ) ;
2024-03-18 11:43:23 -07:00
/**
* Claims a window , creating a swapchain structure for it .
*
2024-08-29 16:08:10 -07:00
* This must be called before SDL_AcquireGPUSwapchainTexture is called using
2024-09-29 01:10:39 +00:00
* the window . You should only call this function from the thread that created
* the window .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and
* SDL_GPU_PRESENTMODE_VSYNC . If you want to have different swapchain
2024-09-05 01:25:36 +00:00
* parameters , you must call SDL_SetGPUSwapchainParameters after claiming the
* window .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window .
2024-09-27 07:30:57 +00:00
* \ returns true on success , or false on failure ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2024-12-11 19:17:12 +00:00
* \ threadsafety This function should only be called from the thread that
* created the window .
2024-12-11 11:16:35 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-08-30 15:31:10 -07:00
* \ sa SDL_ReleaseWindowFromGPUDevice
* \ sa SDL_WindowSupportsGPUPresentMode
* \ sa SDL_WindowSupportsGPUSwapchainComposition
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_ClaimWindowForGPUDevice (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ) ;
/**
* Unclaims a window , destroying its swapchain structure .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window that has been claimed .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_ClaimWindowForGPUDevice
2024-03-18 11:43:23 -07:00
*/
2024-08-30 15:31:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ) ;
/**
* Changes the swapchain parameters for the given claimed window .
*
2024-08-29 22:58:01 +00:00
* This function will fail if the requested present mode or swapchain
* composition are unsupported by the device . Check if the parameters are
2024-08-30 15:31:10 -07:00
* supported via SDL_WindowSupportsGPUPresentMode /
* SDL_WindowSupportsGPUSwapchainComposition prior to calling this function .
2024-03-18 11:43:23 -07:00
*
2025-04-29 22:48:45 +00:00
* SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always
2024-08-29 22:58:01 +00:00
* supported .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window that has been claimed .
2024-09-06 18:38:23 -05:00
* \ param swapchain_composition the desired composition of the swapchain .
* \ param present_mode the desired present mode for the swapchain .
2024-09-30 17:23:50 +00:00
* \ returns true if successful , false on error ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_WindowSupportsGPUPresentMode
* \ sa SDL_WindowSupportsGPUSwapchainComposition
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUSwapchainParameters (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ,
2024-09-06 18:38:23 -05:00
SDL_GPUSwapchainComposition swapchain_composition ,
SDL_GPUPresentMode present_mode ) ;
2024-03-18 11:43:23 -07:00
2024-12-06 11:56:20 -08:00
/**
* Configures the maximum allowed number of frames in flight .
*
2024-12-06 21:46:49 +00:00
* The default value when the device is created is 2. This means that after
* you have submitted 2 frames for presentation , if the GPU has not finished
2024-12-11 19:17:12 +00:00
* working on the first frame , SDL_AcquireGPUSwapchainTexture ( ) will fill the
* swapchain texture pointer with NULL , and
* SDL_WaitAndAcquireGPUSwapchainTexture ( ) will block .
2024-12-06 11:56:20 -08:00
*
2024-12-06 21:46:49 +00:00
* Higher values increase throughput at the expense of visual latency . Lower
* values decrease visual latency at the expense of throughput .
2024-12-06 11:56:20 -08:00
*
2024-12-06 21:46:49 +00:00
* Note that calling this function will stall and flush the command queue to
* prevent synchronization issues .
2024-12-06 11:56:20 -08:00
*
* The minimum value of allowed frames in flight is 1 , and the maximum is 3.
*
* \ param device a GPU context .
2024-12-06 21:46:49 +00:00
* \ param allowed_frames_in_flight the maximum number of frames that can be
2024-12-11 11:16:35 -08:00
* pending on the GPU .
2024-12-06 21:46:49 +00:00
* \ returns true if successful , false on error ; call SDL_GetError ( ) for more
* information .
2024-12-06 11:56:20 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-12-06 11:56:20 -08:00
*/
extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUAllowedFramesInFlight (
SDL_GPUDevice * device ,
Uint32 allowed_frames_in_flight ) ;
2024-03-18 11:43:23 -07:00
/**
* Obtains the texture format of the swapchain for the given window .
2024-09-27 07:30:57 +00:00
*
2024-09-27 00:30:18 -07:00
* Note that this format can change if the swapchain parameters change .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param window an SDL_Window that has been claimed .
* \ returns the texture format of the swapchain .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureFormat (
SDL_GPUDevice * device ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ) ;
/**
* Acquire a texture to use in presentation .
*
2024-08-29 22:58:01 +00:00
* When a swapchain texture is acquired on a command buffer , it will
* automatically be submitted for presentation when the command buffer is
* submitted . The swapchain texture should only be referenced by the command
2024-12-11 11:16:35 -08:00
* buffer used to acquire it .
*
2024-12-11 19:17:12 +00:00
* This function will fill the swapchain texture handle with NULL if too many
2025-05-05 15:10:37 +00:00
* frames are in flight . This is not an error . This NULL pointer should not be
* passed back into SDL . Instead , it should be considered as an indication to
* wait until the swapchain is available .
2024-12-18 11:08:08 -08:00
*
2024-12-18 19:09:01 +00:00
* If you use this function , it is possible to create a situation where many
* command buffers are allocated while the rendering context waits for the GPU
* to catch up , which will cause memory usage to grow . You should use
* SDL_WaitAndAcquireGPUSwapchainTexture ( ) unless you know what you are doing
* with timing .
2024-09-30 10:23:19 -07:00
*
2024-09-30 17:23:50 +00:00
* The swapchain texture is managed by the implementation and must not be
* freed by the user . You MUST NOT call this function from any thread other
* than the one that created the window .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-08-29 22:58:01 +00:00
* \ param window a window that has been claimed .
2024-09-30 10:23:19 -07:00
* \ param swapchain_texture a pointer filled in with a swapchain texture
2024-09-30 17:23:50 +00:00
* handle .
* \ param swapchain_texture_width a pointer filled in with the swapchain
* texture width , may be NULL .
* \ param swapchain_texture_height a pointer filled in with the swapchain
* texture height , may be NULL .
* \ returns true on success , false on error ; call SDL_GetError ( ) for more
* information .
2024-08-29 22:58:01 +00:00
*
2024-12-11 19:17:12 +00:00
* \ threadsafety This function should only be called from the thread that
* created the window .
2024-12-11 11:16:35 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_ClaimWindowForGPUDevice
* \ sa SDL_SubmitGPUCommandBuffer
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2024-10-29 14:43:22 -07:00
* \ sa SDL_CancelGPUCommandBuffer
2024-09-27 13:13:50 -07:00
* \ sa SDL_GetWindowSizeInPixels
2024-12-11 11:16:35 -08:00
* \ sa SDL_WaitForGPUSwapchain
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-12-11 11:16:35 -08:00
* \ sa SDL_SetGPUAllowedFramesInFlight
2024-03-18 11:43:23 -07:00
*/
2024-09-27 00:30:18 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_AcquireGPUSwapchainTexture (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ,
2024-03-18 11:43:23 -07:00
SDL_Window * window ,
2024-09-30 10:23:19 -07:00
SDL_GPUTexture * * swapchain_texture ,
Uint32 * swapchain_texture_width ,
Uint32 * swapchain_texture_height ) ;
2024-03-18 11:43:23 -07:00
2024-12-11 11:16:35 -08:00
/**
* Blocks the thread until a swapchain texture is available to be acquired .
*
* \ param device a GPU context .
* \ param window a window that has been claimed .
* \ returns true on success , false on failure ; call SDL_GetError ( ) for more
* information .
*
2024-12-11 19:17:12 +00:00
* \ threadsafety This function should only be called from the thread that
* created the window .
2024-12-11 11:16:35 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-12-11 11:16:35 -08:00
*
* \ sa SDL_AcquireGPUSwapchainTexture
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-12-11 11:16:35 -08:00
* \ sa SDL_SetGPUAllowedFramesInFlight
*/
extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUSwapchain (
SDL_GPUDevice * device ,
SDL_Window * window ) ;
/**
2024-12-11 19:17:12 +00:00
* Blocks the thread until a swapchain texture is available to be acquired ,
* and then acquires it .
2024-12-11 11:16:35 -08:00
*
* When a swapchain texture is acquired on a command buffer , it will
* automatically be submitted for presentation when the command buffer is
* submitted . The swapchain texture should only be referenced by the command
2024-12-11 19:17:12 +00:00
* buffer used to acquire it . It is an error to call
* SDL_CancelGPUCommandBuffer ( ) after a swapchain texture is acquired .
2024-12-11 11:16:35 -08:00
*
2024-12-22 06:18:11 +00:00
* This function can fill the swapchain texture handle with NULL in certain
* cases , for example if the window is minimized . This is not an error . You
* should always make sure to check whether the pointer is NULL before
* actually using it .
*
2024-12-11 11:16:35 -08:00
* The swapchain texture is managed by the implementation and must not be
* freed by the user . You MUST NOT call this function from any thread other
* than the one that created the window .
*
2025-02-16 17:44:58 +00:00
* The swapchain texture is write - only and cannot be used as a sampler or for
* another reading operation .
*
2024-12-11 11:16:35 -08:00
* \ param command_buffer a command buffer .
* \ param window a window that has been claimed .
* \ param swapchain_texture a pointer filled in with a swapchain texture
* handle .
* \ param swapchain_texture_width a pointer filled in with the swapchain
* texture width , may be NULL .
* \ param swapchain_texture_height a pointer filled in with the swapchain
* texture height , may be NULL .
* \ returns true on success , false on error ; call SDL_GetError ( ) for more
* information .
*
2024-12-11 19:17:12 +00:00
* \ threadsafety This function should only be called from the thread that
* created the window .
2024-12-11 11:16:35 -08:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-12-11 11:16:35 -08:00
*
* \ sa SDL_SubmitGPUCommandBuffer
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2025-02-16 17:44:58 +00:00
* \ sa SDL_AcquireGPUSwapchainTexture
2024-12-11 11:16:35 -08:00
*/
extern SDL_DECLSPEC bool SDLCALL SDL_WaitAndAcquireGPUSwapchainTexture (
SDL_GPUCommandBuffer * command_buffer ,
SDL_Window * window ,
SDL_GPUTexture * * swapchain_texture ,
Uint32 * swapchain_texture_width ,
Uint32 * swapchain_texture_height ) ;
2024-03-18 11:43:23 -07:00
/**
* Submits a command buffer so its commands can be processed on the GPU .
2024-08-29 22:58:01 +00:00
*
2024-03-18 11:43:23 -07:00
* It is invalid to use the command buffer after this is called .
*
* This must be called from the thread the command buffer was acquired on .
*
2024-08-29 22:58:01 +00:00
* All commands in the submission are guaranteed to begin executing before any
* command in a subsequent submission begins executing .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-09-27 07:30:57 +00:00
* \ returns true on success , false on failure ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_AcquireGPUCommandBuffer
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-08-29 16:08:10 -07:00
* \ sa SDL_AcquireGPUSwapchainTexture
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2024-03-18 11:43:23 -07:00
*/
2024-09-27 00:30:18 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_SubmitGPUCommandBuffer (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Submits a command buffer so its commands can be processed on the GPU , and
* acquires a fence associated with the command buffer .
*
* You must release this fence when it is no longer needed or it will cause a
* leak . It is invalid to use the command buffer after this is called .
2024-03-18 11:43:23 -07:00
*
* This must be called from the thread the command buffer was acquired on .
*
2024-08-29 22:58:01 +00:00
* All commands in the submission are guaranteed to begin executing before any
* command in a subsequent submission begins executing .
2024-03-18 11:43:23 -07:00
*
2024-09-06 18:38:23 -05:00
* \ param command_buffer a command buffer .
2024-09-27 07:30:57 +00:00
* \ returns a fence associated with the command buffer , or NULL on failure ;
* call SDL_GetError ( ) for more information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_AcquireGPUCommandBuffer
2024-12-18 11:08:08 -08:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-08-29 16:08:10 -07:00
* \ sa SDL_AcquireGPUSwapchainTexture
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBuffer
2024-08-29 16:08:10 -07:00
* \ sa SDL_ReleaseGPUFence
2024-03-18 11:43:23 -07:00
*/
2025-02-04 01:14:56 +01:00
extern SDL_DECLSPEC SDL_GPUFence * SDLCALL SDL_SubmitGPUCommandBufferAndAcquireFence (
2024-09-06 18:38:23 -05:00
SDL_GPUCommandBuffer * command_buffer ) ;
2024-03-18 11:43:23 -07:00
2024-10-29 14:43:22 -07:00
/**
2024-10-29 21:43:56 +00:00
* Cancels a command buffer .
*
* None of the enqueued commands are executed .
2024-10-29 14:43:22 -07:00
*
2024-12-18 11:08:08 -08:00
* It is an error to call this function after a swapchain texture has been
* acquired .
*
2024-10-29 14:43:22 -07:00
* This must be called from the thread the command buffer was acquired on .
*
2024-12-18 11:08:08 -08:00
* You must not reference the command buffer after calling this function .
2024-10-29 14:43:22 -07:00
*
* \ param command_buffer a command buffer .
* \ returns true on success , false on error ; call SDL_GetError ( ) for more
* information .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-10-29 14:43:22 -07:00
*
2024-12-18 23:45:05 +03:00
* \ sa SDL_WaitAndAcquireGPUSwapchainTexture
2024-10-29 14:43:22 -07:00
* \ sa SDL_AcquireGPUCommandBuffer
* \ sa SDL_AcquireGPUSwapchainTexture
*/
extern SDL_DECLSPEC bool SDLCALL SDL_CancelGPUCommandBuffer (
SDL_GPUCommandBuffer * command_buffer ) ;
2024-03-18 11:43:23 -07:00
/**
* Blocks the thread until the GPU is completely idle .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-27 07:30:57 +00:00
* \ returns true on success , false on failure ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_WaitForGPUFences
2024-03-18 11:43:23 -07:00
*/
2024-09-27 00:30:18 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUIdle (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
/**
* Blocks the thread until the given fences are signaled .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-09-06 18:38:23 -05:00
* \ param wait_all if 0 , wait for any fence to be signaled , if 1 , wait for all
2024-09-06 23:39:48 +00:00
* fences to be signaled .
2024-09-06 18:38:23 -05:00
* \ param fences an array of fences to wait on .
* \ param num_fences the number of fences in the fences array .
2024-09-27 07:30:57 +00:00
* \ returns true on success , false on failure ; call SDL_GetError ( ) for more
* information .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
* \ sa SDL_WaitForGPUIdle
2024-03-18 11:43:23 -07:00
*/
2024-09-27 00:30:18 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUFences (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
2024-09-18 07:52:28 -07:00
bool wait_all ,
2024-09-06 18:38:23 -05:00
SDL_GPUFence * const * fences ,
Uint32 num_fences ) ;
2024-03-18 11:43:23 -07:00
/**
* Checks the status of a fence .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param fence a fence .
2024-09-18 07:52:28 -07:00
* \ returns true if the fence is signaled , false if it is not .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_QueryGPUFence (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
SDL_GPUFence * fence ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-30 15:31:10 -07:00
* Releases a fence obtained from SDL_SubmitGPUCommandBufferAndAcquireFence .
2024-03-18 11:43:23 -07:00
*
2025-02-02 21:17:22 +00:00
* You must not reference the fence after calling this function .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param fence a fence .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-30 15:31:10 -07:00
* \ sa SDL_SubmitGPUCommandBufferAndAcquireFence
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUFence (
SDL_GPUDevice * device ,
SDL_GPUFence * fence ) ;
2024-03-18 11:43:23 -07:00
/* Format Info */
/**
* Obtains the texel block size for a texture format .
*
2024-09-06 18:38:23 -05:00
* \ param format the texture format you want to know the texel size of .
2024-08-29 22:58:01 +00:00
* \ returns the texel block size of the texture format .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* \ sa SDL_UploadToGPUTexture
2024-03-18 11:43:23 -07:00
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize (
2024-09-06 18:38:23 -05:00
SDL_GPUTextureFormat format ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Determines whether a texture format is supported for a given type and
* usage .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param format the texture format to check .
* \ param type the type of texture ( 2 D , 3 D , Cube ) .
* \ param usage a bitmask of all usage scenarios to check .
* \ returns whether the texture format is supported for this type and usage .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
SDL_GPUTextureFormat format ,
SDL_GPUTextureType type ,
SDL_GPUTextureUsageFlags usage ) ;
2024-03-18 11:43:23 -07:00
/**
* Determines if a sample count for a texture format is supported .
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
* \ param format the texture format to check .
2024-09-06 18:38:23 -05:00
* \ param sample_count the sample count to check .
2025-03-14 09:29:59 -07:00
* \ returns whether the sample count is supported for this texture format .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*/
2024-09-18 07:52:28 -07:00
extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount (
2024-08-29 16:08:10 -07:00
SDL_GPUDevice * device ,
SDL_GPUTextureFormat format ,
2024-09-06 18:38:23 -05:00
SDL_GPUSampleCount sample_count ) ;
2024-10-10 16:34:38 -07:00
/**
* Calculate the size in bytes of a texture format with dimensions .
*
* \ param format a texture format .
* \ param width width in pixels .
* \ param height height in pixels .
* \ param depth_or_layer_count depth for 3 D textures or layer count otherwise .
* \ returns the size of a texture with this format and dimensions .
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-10-10 16:34:38 -07:00
*/
extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize (
SDL_GPUTextureFormat format ,
Uint32 width ,
Uint32 height ,
Uint32 depth_or_layer_count ) ;
2025-09-07 21:15:51 -07:00
/**
* Get the SDL pixel format corresponding to a GPU texture format .
*
* \ param format a texture format .
2025-09-10 19:09:24 +00:00
* \ returns the corresponding pixel format , or SDL_PIXELFORMAT_UNKNOWN if
* there is no corresponding pixel format .
2025-09-07 21:15:51 -07:00
*
* \ since This function is available since SDL 3.4 .0 .
*/
extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatFromGPUTextureFormat ( SDL_GPUTextureFormat format ) ;
/**
* Get the GPU texture format corresponding to an SDL pixel format .
*
* \ param format a pixel format .
2025-09-10 19:09:24 +00:00
* \ returns the corresponding GPU texture format , or
* SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU
* texture format .
2025-09-07 21:15:51 -07:00
*
* \ since This function is available since SDL 3.4 .0 .
*/
extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUTextureFormatFromPixelFormat ( SDL_PixelFormat format ) ;
2024-03-18 11:43:23 -07:00
# ifdef SDL_PLATFORM_GDK
/**
2024-08-29 22:58:01 +00:00
* Call this to suspend GPU operation on Xbox when you receive the
* SDL_EVENT_DID_ENTER_BACKGROUND event .
2024-03-18 11:43:23 -07:00
*
2024-08-29 16:08:10 -07:00
* Do NOT call any SDL_GPU functions after calling this function ! This must
2024-08-29 22:58:01 +00:00
* also be called before calling SDL_GDKSuspendComplete .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
* \ sa SDL_AddEventWatch
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendGPU ( SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
/**
2024-08-29 22:58:01 +00:00
* Call this to resume GPU operation on Xbox when you receive the
* SDL_EVENT_WILL_ENTER_FOREGROUND event .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* When resuming , this function MUST be called before calling any other
2024-08-29 16:08:10 -07:00
* SDL_GPU functions .
2024-03-18 11:43:23 -07:00
*
2024-08-29 22:58:01 +00:00
* \ param device a GPU context .
2024-03-18 11:43:23 -07:00
*
2025-01-21 13:12:25 -05:00
* \ since This function is available since SDL 3.2 .0 .
2024-03-18 11:43:23 -07:00
*
* \ sa SDL_AddEventWatch
*/
2024-08-29 16:08:10 -07:00
extern SDL_DECLSPEC void SDLCALL SDL_GDKResumeGPU ( SDL_GPUDevice * device ) ;
2024-03-18 11:43:23 -07:00
# endif /* SDL_PLATFORM_GDK */
# ifdef __cplusplus
}
# endif /* __cplusplus */
2024-08-31 10:02:46 -07:00
# include <SDL3/SDL_close_code.h>
2024-03-18 11:43:23 -07:00
2024-08-31 10:02:46 -07:00
# endif /* SDL_gpu_h_ */