Releases · libsdl-org/SDL

12 min read Original article ↗

3.3.6

This is an SDL 3.4.0 release candidate, so please let us know if you run into any issues with it!

In addition to bug fixes since the last release candidate, we've made the following API changes:

  • Added SDL_HINT_MOUSE_DPI_SCALE_CURSORS and changed the default to "0", so cursors don't unexpectedly change size.
  • SDL_PROP_SURFACE_ROTATION_NUMBER has been replaced with SDL_PROP_SURFACE_ROTATION_FLOAT
  • SDL_HINT_EMSCRIPTEN_FILL_DOCUMENT and related properties have been replaced with the SDL_WINDOW_FILL_DOCUMENT flag and SDL_SetWindowFillDocument()

3.3.4

This is an SDL 3.4.0 release candidate, so please let us know if you run into any issues with it!

In addition to lots of bug fixes and general system improvements, SDL 3.4.0 has some major themes of improved interoperability between the 3D GPU API and the 2D rendering API, improved Emscripten support, improved pen handling, and native support for PNG images.

Here is a full list of the API changes since the last release:

General:

  • Added SDL_CreateAnimatedCursor() to create animated color cursors
  • Added SDL_SetWindowProgressState(), SDL_SetWindowProgressValue(), SDL_GetWindowProgressState(), and SDL_GetWindowProgressValue() to show progress in the window's taskbar icon on Windows and Linux
  • Added GPU device creation properties to enable the GPU API on older hardware if you're not using these features:
    • 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
    • SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN
  • Added SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER to enable configuring Vulkan features when creating a GPU device
  • Added SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN to allow requiring Vulkan hardware acceleration when creating a GPU device
  • Added SDL_GetGPUDeviceProperties() to query information from a GPU device:
    • SDL_PROP_GPU_DEVICE_NAME_STRING
    • SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING
    • SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING
    • SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING
  • Added SDL_GetPixelFormatFromGPUTextureFormat() and SDL_GetGPUTextureFormatFromPixelFormat()
  • Added SDL_CreateGPURenderer() and SDL_GetGPURendererDevice() to create a 2D renderer for use with GPU rendering.
  • Added SDL_CreateGPURenderState(), SDL_SetGPURenderStateFragmentUniforms(), SDL_SetGPURenderState(), and SDL_DestroyGPURenderState() to use fragment shaders with a GPU 2D renderer
  • Added SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER to create a 2D texture from an existing GPU texture
  • Added SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER to get the GPU texture from a 2D texture when using the GPU 2D renderer
  • Added support for YUV textures and HDR colorspaces to the GPU 2D renderer
  • Added support for textures with palettes, and SDL_GetTexturePalette() and SDL_SetTexturePalette() to interact with them
  • Added SDL_RenderTexture9GridTiled() to do tiled instead of stretched 9-grid texture rendering
  • Added SDL_GetDefaultTextureScaleMode() and SDL_SetDefaultTextureScaleMode() to set the texture scale mode for new textures
  • Added SDL_GetRenderTextureAddressMode() and SDL_SetRenderTextureAddressMode() to change the texture addressing mode
  • Added SDL_TEXTURE_ADDRESS_WRAP to allow wrapping of textures if the renderer has SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN set
  • The default YUV colorspace is BT.601 limited range, for compatibility with SDL2
  • Added SDL_SCALEMODE_PIXELART as an improved scaling algorithm for pixel art without introducing blurring
  • Added SDL_FLIP_HORIZONTAL_AND_VERTICAL to flip a surface both horizontally and vertically
  • Added SDL_LoadPNG(), SDL_LoadPNG_IO(), SDL_SavePNG(), and SDL_SavePNG_IO() to load and save PNG images
  • Added SDL_LoadSurface() and SDL_LoadSurface_IO() to detect BMP and PNG formats and load them as surfaces
  • Added SDL_PROP_SURFACE_ROTATION_NUMBER to indicate the rotation needed to display camera images upright
  • Added SDL_RotateSurface() to create a rotated copy of a surface
  • SDL_EVENT_WINDOW_EXPOSED now sets data1 to true if it is sent during live resizing
  • Added SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED, which is sent when the usable desktop bounds change
  • Added SDL_EVENT_SCREEN_KEYBOARD_SHOWN, which is sent when the on-screen keyboard has been shown
  • Added SDL_EVENT_SCREEN_KEYBOARD_HIDDEN, which is sent when the on-screen keyboard has been hidden
  • Added pinch gesture events: SDL_EVENT_PINCH_BEGIN, SDL_EVENT_PINCH_UPDATE, SDL_EVENT_PINCH_END
  • SDL_EVENT_AUDIO_DEVICE_ADDED will be sent during initialization for each audio device
  • SDL_GetCameraPermissionState() returns SDL_CameraPermissionState instead of int
  • Added SDL_PutAudioStreamDataNoCopy() to do more efficient audio stream processing in some cases
  • Added SDL_PutAudioStreamPlanarData() to add planar audio data instead of interleaved data to an audio stream
  • Added SDL_HINT_AUDIO_DEVICE_RAW_STREAM to signal that the OS shouldn't do further audio processing, useful for applications that handle noise canceling, etc.
  • Added SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN to allow streams that persist beyond the audio subsystem lifetime.
  • Added enhanced support for 8BitDo controllers
  • Added enhanced support for FlyDigi controllers
  • Added enhanced support for Hand Held Legend SInput controllers
  • Added support for wired Nintendo Switch 2 controllers when built with libusb
  • Added SDL_hid_get_properties() to associate SDL properties with HID devices
  • Added SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER to query the libusb handle from an SDL_hid_device, if it's been opened with libusb
  • Added SDL_SetRelativeMouseTransform() to add custom mouse input transformation
  • Added SDL_GetPenDeviceType() to determine whether a pen is on the screen or on a separate touchpad
  • SDL_HINT_MAIN_CALLBACK_RATE may be set to a floating point callback rate
  • Added SDL_GetEventDescription() to get an English description of an event, suitable for logging
  • Added SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER to allow custom freeing of the memory used by SDL_IOFromMem() and SDL_IOFromConstMem()
  • Added SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING to set the working directory for new processes
  • Added verbose log output when the DEBUG_INVOCATION environment variable is set to "1"
  • Added SDL_AddAtomicU32()
  • Added SDL_GetSystemPageSize() to get the system page size
  • Added SDL_ALIGNED() to signal that data should have a specific alignment

Windows:

  • Added SDL_HINT_RENDER_DIRECT3D11_WARP to enable D3D11 software rasterization
  • Using SDL_InsertGPUDebugLabel(), SDL_PushGPUDebugGroup(), and SDL_PopGPUDebugGroup() requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable
  • Added SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER so you can query the HMONITOR associated with a display
  • SDL_HINT_AUDIO_DEVICE_STREAM_ROLE is used by the WASAPI audio driver to set the audio stream category
  • Added SDL_HINT_AUDIO_DEVICE_RAW_STREAM to signal whether the OS audio driver should do additional signal processing
  • Added SDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS to allow disabling some system hotkeys when in raw input mode
  • SDL_HINT_WINDOWS_GAMEINPUT is disabled by default

macOS:

  • Added SDL_HINT_MAC_PRESS_AND_HOLD to control whether holding down a key will repeat the pressed key or open the accents menu

Linux:

  • Added atomic support for KMSDRM
  • Added SDL_HINT_KMSDRM_ATOMIC to control whether KMSDRM will use atomic functionality
  • Added SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER so you can query the wl_output associated with a display

Emscripten:

  • Added SDL_HINT_EMSCRIPTEN_FILL_DOCUMENT for applications that don't want to be fullscreen, but would like to fill the window
  • Added SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING to allow setting the SDL canvas ID, and SDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING to query it on existing windows
  • Added SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_FILL_DOCUMENT_BOOLEAN to indicate that the window should fill the document, and SDL_PROP_WINDOW_EMSCRIPTEN_FILL_DOCUMENT_BOOLEAN to query it on existing windows
  • Added SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING to specify where keyboard input is bound, and SDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING to query it on existing windows

iOS:

  • SDL now supports window scenes, fixing the warning "CLIENT OF UIKIT REQUIRES UPDATE"
  • Added SDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER to specify the window scene for a window

visionOS:

  • The default refresh rate has been increased to 90Hz
  • SDL_SetWindowSize() changes the size of the window on Vision Pro headsets

PlayStation 2:

  • Added the following hints to control the display parameters: SDL_HINT_PS2_GS_WIDTH, SDL_HINT_PS2_GS_HEIGHT, SDL_HINT_PS2_GS_PROGRESSIVE, SDL_HINT_PS2_GS_MODE

Note: On Unix platforms SDL provides ELF notes describing its non-mandatory library dependencies in the format described by https://systemd.io/ELF_DLOPEN_METADATA/. Some of these libraries are quite important, so distribution vendors who package SDL should parse the ELF notes and consider generating dependencies at the packaging level, for example by using https://github.com/systemd/package-notes. Other libraries and games can add similar ELF notes to describe their own dependencies by using the SDL_ELF_NOTE_DLOPEN macro.

3.2.28

This is a stable bugfix release, with the following changes:

  • Fixed a divide by zero with a zero sized blit in some cases
  • Fixed blitting bitmaps with a non-zero x offset
  • Fixed a crash in the vulkan renderer when the window is minimized
  • Fixed the initial X11 window position in some environments
  • Fixed the channel mapping for surround sound on PulseAudio
  • Fixed the sensor axis ordering with the Linux Nintendo driver
  • Fixed Xbox 360 controller mappings on newer Linux kernels
  • Made Nintendo Switch controller initialization more robust
  • Fixed the paddle mapping for Steam Controllers

3.2.26

This is a stable bugfix release, with the following changes:

  • Improved validation and fixed memory leaks in the GPU subsystem
  • Fixed a delay at shutdown when the mouse is grabbed under X11
  • Do full rectangle intersection for empty rectangles
  • Fixed destination coordinates when using scale with the software renderer
  • Clipboard callbacks are only called with the mime types they expect
  • Fixed the Moonlander MK1 Keyboard being detected as a controller
  • Fixed the 8BitDo Ultimate 2C Wireless Controller showing up twice on some systems
  • Added a Linux mapping for the 8BitDo Pro 3 controller
  • Fixed getting keyboard events from gamepads on iOS 26
  • Added support for the Zenaim Arcade Controller
  • Fixed emulated touch on Android
  • Added a workaround for the Android 14 OS bug "java.lang.NullPointerException android.view.View.onResolvePointerIcon"
  • Fixed page alignment for the Android release archive
  • Corrected texture colors on PS2

3.3.2

This is a preview of the upcoming 3.4 release!

The API and ABI are still in progress, but we wanted to get this out so everyone can try out the new features and provide feedback.

Please report any issues on GitHub:
https://github.com/libsdl-org/SDL/issues

Here are the highlights of this preview release:

  • Added SDL_CreateAnimatedCursor() to create animated color cursors
  • Added SDL_SetWindowProgressState(), SDL_SetWindowProgressValue(), SDL_GetWindowProgressState(), and SDL_GetWindowProgressValue() to show progress in the window's taskbar icon on Windows and Linux
  • Added SDL_GetGPUDeviceProperties() to get the properties of an SDL GPU device
  • Added SDL_GetPixelFormatFromGPUTextureFormat() and SDL_GetGPUTextureFormatFromPixelFormat()
  • Added SDL_CreateGPURenderer() and SDL_GetGPURendererDevice() to create a 2D renderer for use with GPU rendering.
  • Added SDL_CreateGPURenderState(), SDL_SetGPURenderStateFragmentUniforms(), SDL_SetGPURenderState(), and SDL_DestroyGPURenderState() to use fragment shaders with a GPU 2D renderer
  • Added support for YUV textures and HDR colorspaces to the GPU 2D renderer
  • Added support for textures with palettes, and SDL_GetTexturePalette() and SDL_SetTexturePalette() to interact with them
  • Added SDL_RenderTexture9GridTiled() to do tiled instead of stretched 9-grid texture rendering
  • Added SDL_GetDefaultTextureScaleMode() and SDL_SetDefaultTextureScaleMode() to set the texture scale mode for new textures
  • Added SDL_GetRenderTextureAddressMode() and SDL_SetRenderTextureAddressMode() to change the texture addressing mode
  • Added SDL_TEXTURE_ADDRESS_WRAP to allow wrapping of textures if the renderer has SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN set
  • Added SDL_LoadPNG(), SDL_LoadPNG_IO(), SDL_SavePNG(), and SDL_SavePNG_IO() to load and save PNG images
  • Added SDL_RotateSurface() to create a rotated copy of a surface
  • Added SDL_PutAudioStreamDataNoCopy() to do more efficient audio stream processing in some cases
  • Added SDL_PutAudioStreamPlanarData() to add planar audio data instead of interleaved data to an audio stream
  • Added SDL_HINT_AUDIO_DEVICE_RAW_STREAM to signal that the OS shouldn't do further audio processing, useful for applications that handle noise canceling, etc.
  • Added enhanced support for 8BitDo controllers
  • Added enhanced support for FlyDigi controllers
  • Added enhanced support for Hand Held Legend SInput controllers
  • Added SDL_hid_get_properties() to associate SDL properties with HID devices
  • Added SDL_SetRelativeMouseTransform() to add custom mouse input transformation
  • Added SDL_GetPenDeviceType() to determine whether a pen is on the screen or on a separate touchpad
  • Added SDL_GetEventDescription() to get an English description of an event, suitable for logging
  • Added verbose log output when the DEBUG_INVOCATION environment variable is set to "1"
  • Added SDL_AddAtomicU32()
  • Added SDL_GetSystemPageSize() to get the system page size

Windows:

  • Added SDL_HINT_RENDER_DIRECT3D11_WARP to enable D3D11 software rasterization
  • SDL_HINT_AUDIO_DEVICE_STREAM_ROLE is used by the WASAPI audio driver to set the audio stream category
  • SDL_HINT_WINDOWS_GAMEINPUT is disabled by default

Linux:

  • Added atomic support for KMSDRM
  • Added SDL_HINT_KMSDRM_ATOMIC to control whether KMSDRM will use atomic functionality

Emscripten:

  • Added SDL_HINT_EMSCRIPTEN_FILL_DOCUMENT for applications that don't want to be fullscreen, but would like to fill the window

PlayStation 2:

  • Added the following hints to control the display parameters: SDL_HINT_PS2_GS_WIDTH, SDL_HINT_PS2_GS_HEIGHT, SDL_HINT_PS2_GS_PROGRESSIVE, SDL_HINT_PS2_GS_MODE

Note: On Unix platforms SDL provides ELF notes describing its non-mandatory library dependencies in the format described by https://systemd.io/ELF_DLOPEN_METADATA/. Some of these libraries are quite important, so distribution vendors who package SDL should parse the ELF notes and consider generating dependencies at the packaging level, for example by using https://github.com/systemd/package-notes. Other libraries and games can add similar ELF notes to describe their own dependencies by using the SDL_ELF_NOTE_DLOPEN macro.

3.2.24

This is a stable bugfix release, with the following changes:

  • Fixed a crash at startup on some installations of macOS
  • Fixed the reported fullscreen window position on MacBooks with a camera notch
  • Fixed Android applications losing vsync when being resumed
  • Fixed SDL_RunOnMainThread() on Android when using SDL_WaitEvent()
  • Fixed a crash when enumerating Steam Controllers
  • Fixed rumble strength on DualSense Edge and Bluetooth connected controllers
  • Fixed the HP Deluxe Webcam KQ246AA being detected as joystick
  • Disable Windows.Gaming.Input by default, this functionality is already covered by other APIs
  • Use the correct controller name on iOS
  • Enabled high refresh rates on iOS when using main callbacks
  • Fixed VMware not capturing the mouse when relative mode is enabled
  • Increased the maximum color target bindings from 4 to 8 in the GPU API
  • When using SDL_SetRenderLogicalPresentation(), letterboxing now uses the clear color instead of black
  • Fixed crash at startup when redirecting X11 output over ssh
  • Fixed a memory leak when using detached threads

3.2.22

This is a stable bugfix release, with the following changes:

  • Fixed fullscreen transition edge cases on Windows and macOS
  • Fixed the dock occasionally showing on macOS when launching an SDL app
  • Update NDK to r28c, remove page size handling, and add 16kB page size verification
  • Fixed signed 8-bit audio on Android
  • Fixed fingerprint sensors being detected as joysticks on Android
  • Added support for rumbling joysticks on Emscripten
  • Support the "ambient" value for SDL_HINT_AUDIO_CATEGORY on iOS

2.32.10

This is a stable bugfix release, with the following changes:

  • Fixed the dock occasionally showing on macOS when launching an SDL app
  • Report the correct device audio format when using Pipewire
  • Fixed signed 8-bit audio on Android
  • Support the "ambient" value for SDL_HINT_AUDIO_CATEGORY on iOS
  • Improved thumbstick range for Nintendo Switch Pro Controllers
  • Fixed loading user calibration for Nintendo Switch Pro Controllers

3.2.20

This is a stable bugfix release, with the following changes:

  • Fixed a crash when passing large invalid coordinates to SDL_BlitSurfaceScaled()
  • Fixed doubled mouse wheel events on X11
  • Fixed doubled SDL_EVENT_GAMEPAD_ADDED events for controllers with automatic gamepad mappings
  • Added support for the Google Play 16 KB page size requirement
  • Fixed a crash on Android if using SDL for other functionality besides video
  • Fixed dynamic loading of the environ symbol on FreeBSD
  • Fixed audio playback on PSP

3.2.18

This is a stable bugfix release, with the following changes:

  • Added SDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN to support non-constrained and non-grabbing popups
  • Fixed a crash in SDL_GetAudioDeviceChannelMap()
  • Fixed a crash on older Proton runtimes
  • Fixed unregistering raw input on Windows
  • Fixed duplicate mouse events when using a pen under X11
  • Handle quirks with window management on XMonad and fvwm
  • Fixed showing the dock briefly at launch on macOS
  • Fixed replacing existing gamepad mappings at runtime
  • Improved thumbstick range for Nintendo Switch Pro Controllers
  • Fixed loading user calibration for Nintendo Switch Pro Controllers
  • Added support for the ZEROPLUS P4 Wired Gamepad
  • Fixed input from the MayFlash GameCube adapter with version 7 firmware
  • Added support for the NACON Revolution X Unlimited controller over Bluetooth on macOS