27 GPU API
This section covers SDL3’s new GPU API, which provides a modern cross-platform graphics abstraction supporting Vulkan, Direct3D 12, and Metal backends.
The GPU API is more complex than the 2D renderer but provides much more power and control for 3D graphics and compute workloads.
27.1 Devices
procedure
(make-gpu-device [ #:shader-formats formats #:debug? debug? #:driver driver]) → gpu-device?
formats : exact-nonnegative-integer? = SDL_GPU_SHADERFORMAT_SPIRV debug? : boolean? = #f driver : (or/c string? #f) = #f
formats specifies which shader formats are required (e.g., SPIRV, DXBC, MSL). debug? enables debug/validation layers. driver optionally forces a specific backend.
(define device (make-gpu-device #:debug? #t))
procedure
(gpu-device? v) → boolean?
v : any/c
procedure
(gpu-device-destroy! device) → void?
device : gpu-device?
Note: Devices are automatically destroyed when their custodian shuts down.
procedure
(gpu-device-driver device) → string?
device : gpu-device?
procedure
(gpu-device-shader-formats device) → exact-nonnegative-integer?
device : gpu-device?
procedure
(gpu-supports-shader-formats? formats [ #:driver driver]) → boolean? formats : exact-nonnegative-integer? driver : (or/c string? #f) = #f
27.2 Swapchain
The swapchain manages the images presented to a window.
procedure
(gpu-claim-window! device window) → void?
device : gpu-device? window : cpointer?
Must be called before acquiring swapchain textures.
procedure
(gpu-release-window! device window) → void?
device : gpu-device? window : cpointer?
procedure
(gpu-swapchain-texture-format device window) → exact-nonnegative-integer? device : gpu-device? window : cpointer?
procedure
(gpu-set-swapchain-parameters! device window composition present-mode) → void? device : gpu-device? window : cpointer? composition : exact-nonnegative-integer? present-mode : exact-nonnegative-integer?
procedure
(gpu-acquire-swapchain-texture cmd-buffer window)
→
(or/c cpointer? #f) exact-nonnegative-integer? exact-nonnegative-integer? cmd-buffer : cpointer? window : cpointer?
Returns (values texture width height), or (values #f 0 0) if no texture is available.
procedure
(gpu-wait-for-swapchain! device window) → void?
device : gpu-device? window : cpointer?
27.3 Command Buffers
Command buffers record GPU commands for later submission.
procedure
(gpu-acquire-command-buffer device) → cpointer?
device : gpu-device?
procedure
(gpu-submit! cmd-buffer) → void?
cmd-buffer : cpointer?
procedure
(gpu-submit-and-acquire-fence! device cmd-buffer) → gpu-fence? device : gpu-device? cmd-buffer : cpointer?
procedure
(gpu-cancel-command-buffer! cmd-buffer) → void?
cmd-buffer : cpointer?
27.4 Render Passes
Render passes define a set of render targets and rendering operations.
procedure
(gpu-begin-render-pass cmd-buffer color-targets [ #:depth-stencil-target depth-stencil]) → cpointer? cmd-buffer : cpointer? color-targets : cpointer? depth-stencil : (or/c cpointer? #f) = #f
color-targets is a pointer to color target info structures.
procedure
(gpu-end-render-pass! pass) → void?
pass : cpointer?
27.5 Graphics Pipelines
Pipelines define the complete graphics state for rendering.
procedure
(make-gpu-graphics-pipeline device create-info) → gpu-graphics-pipeline? device : gpu-device? create-info : cpointer?
procedure
v : any/c
procedure
(gpu-graphics-pipeline-destroy! pipeline) → void?
pipeline : gpu-graphics-pipeline?
procedure
(gpu-bind-graphics-pipeline! render-pass pipeline) → void? render-pass : cpointer? pipeline : gpu-graphics-pipeline?
27.6 Shaders
procedure
(make-gpu-shader device create-info) → gpu-shader?
device : gpu-device? create-info : cpointer?
procedure
(gpu-shader? v) → boolean?
v : any/c
procedure
(gpu-shader-ptr shader) → cpointer?
shader : gpu-shader?
procedure
(gpu-shader-destroy! shader) → void?
shader : gpu-shader?
27.7 Buffers
27.7.1 GPU Buffers
GPU buffers hold vertex, index, and uniform data on the GPU.
procedure
(make-gpu-buffer device create-info) → gpu-buffer?
device : gpu-device? create-info : cpointer?
procedure
(gpu-buffer? v) → boolean?
v : any/c
procedure
(gpu-buffer-ptr buffer) → cpointer?
buffer : gpu-buffer?
procedure
(gpu-buffer-destroy! buffer) → void?
buffer : gpu-buffer?
27.7.2 Transfer Buffers
Transfer buffers are used to upload data from CPU to GPU.
procedure
(make-gpu-transfer-buffer device create-info) → gpu-transfer-buffer? device : gpu-device? create-info : cpointer?
procedure
(gpu-transfer-buffer? v) → boolean?
v : any/c
procedure
(gpu-transfer-buffer-ptr buffer) → cpointer?
buffer : gpu-transfer-buffer?
procedure
(gpu-transfer-buffer-destroy! buffer) → void?
buffer : gpu-transfer-buffer?
procedure
(gpu-map-transfer-buffer device buffer [ #:cycle? cycle?]) → cpointer? device : gpu-device? buffer : gpu-transfer-buffer? cycle? : boolean? = #f
Returns a pointer to the buffer memory.
procedure
(gpu-unmap-transfer-buffer! device buffer) → void?
device : gpu-device? buffer : gpu-transfer-buffer?
27.8 Copy Passes
Copy passes transfer data between buffers and textures.
procedure
(gpu-begin-copy-pass cmd-buffer) → cpointer?
cmd-buffer : cpointer?
procedure
(gpu-end-copy-pass! pass) → void?
pass : cpointer?
procedure
(gpu-upload-to-buffer! copy-pass source destination [ #:cycle? cycle?]) → void? copy-pass : cpointer? source : cpointer? destination : cpointer? cycle? : boolean? = #f
procedure
(gpu-upload-to-texture! copy-pass source destination [ #:cycle? cycle?]) → void? copy-pass : cpointer? source : cpointer? destination : cpointer? cycle? : boolean? = #f
27.9 Textures
procedure
(make-gpu-texture device create-info) → gpu-texture?
device : gpu-device? create-info : cpointer?
procedure
(gpu-texture? v) → boolean?
v : any/c
procedure
(gpu-texture-destroy! texture) → void?
texture : gpu-texture?
procedure
(gpu-set-texture-name! device texture name) → void?
device : gpu-device? texture : gpu-texture? name : string?
27.10 Samplers
procedure
(make-gpu-sampler device create-info) → gpu-sampler?
device : gpu-device? create-info : cpointer?
procedure
(gpu-sampler? v) → boolean?
v : any/c
procedure
(gpu-sampler-destroy! sampler) → void?
sampler : gpu-sampler?
27.11 Drawing
procedure
(gpu-bind-vertex-buffers! render-pass bindings [ #:first-slot first-slot]) → void? render-pass : cpointer? bindings : cpointer? first-slot : exact-nonnegative-integer? = 0
procedure
(gpu-bind-index-buffer! render-pass binding element-size) → void? render-pass : cpointer? binding : cpointer? element-size : exact-nonnegative-integer?
procedure
(gpu-set-viewport! render-pass viewport) → void?
render-pass : cpointer? viewport : cpointer?
procedure
(gpu-set-scissor! render-pass rect) → void?
render-pass : cpointer? rect : cpointer?
procedure
(gpu-push-vertex-uniform-data! cmd-buffer slot data length) → void? cmd-buffer : cpointer? slot : exact-nonnegative-integer? data : cpointer? length : exact-nonnegative-integer?
procedure
(gpu-push-fragment-uniform-data! cmd-buffer slot data length) → void? cmd-buffer : cpointer? slot : exact-nonnegative-integer? data : cpointer? length : exact-nonnegative-integer?
procedure
(gpu-draw-primitives! render-pass num-vertices [ #:num-instances num-instances #:first-vertex first-vertex #:first-instance first-instance]) → void? render-pass : cpointer? num-vertices : exact-nonnegative-integer? num-instances : exact-nonnegative-integer? = 1 first-vertex : exact-nonnegative-integer? = 0 first-instance : exact-nonnegative-integer? = 0
procedure
(gpu-draw-indexed-primitives! render-pass num-indices [ #:num-instances num-instances #:first-index first-index #:vertex-offset vertex-offset #:first-instance first-instance]) → void? render-pass : cpointer? num-indices : exact-nonnegative-integer? num-instances : exact-nonnegative-integer? = 1 first-index : exact-nonnegative-integer? = 0 vertex-offset : exact-integer? = 0 first-instance : exact-nonnegative-integer? = 0
27.12 Fences
Fences are used for GPU-CPU synchronization.
procedure
(gpu-fence? v) → boolean?
v : any/c
procedure
(gpu-query-fence fence) → boolean?
fence : gpu-fence?
procedure
(gpu-release-fence! fence) → void?
fence : gpu-fence?
procedure
(gpu-wait-for-idle! device) → void?
device : gpu-device?
27.13 Blitting
procedure
(gpu-blit-texture! cmd-buffer blit-info) → void?
cmd-buffer : cpointer? blit-info : cpointer?